添加考试功能总结

经过一个寒假的学习,我对oc和ios开发有了一定的了解,也侥幸成为了实验室的一员,学长三周前布置了一个任务,做一个添加考试的app(在此之前一直漫无目地的学习ios,几乎没有进步,但做完这个程序感觉学到了好多,所谓在项目中成长嘛),在这里总结一下我学到的东西:

1.首先大框架上是围绕课程展开的,用面向对象来说课程就是一个类,展示课程要用到UITableView和cell,这便涉及到对象的封装,cell的封装,cell的重用,UITableViewDataSource和UITableViewDelegate协议方法,将对象放于数组内等等,之前做个几个类似的程序,所以还不算困难。

2.点击“添加考试”按钮弹出添加界面用到模态窗口,这个也用过多次,还有就是要将数据传回主界面创建cell,自定义协议,通过代理传数据,被传递的控制器当做代理。

3.点击cell进入一个详情界面,显示出课程各个内容,然后在详情界面还有编辑按钮,点击进入编辑界面,这里我没有重新创建新的控制器,还是用创建界面那个控制器,但这会出现一个问题,创建课程和修改课程都需要向其他控制器传递数据,所以在编辑完或者创建完传数据时需要判断代理的类,如果代理是ViewController调用对应的代理方法,如果代理是DetailViewController调用对应代理方法。

4.时间选择器UIDatePicker

有这么几种形式的时间UIDatePickerModeDate、UIDatePickerModeTime、UIDatePickerModeDateAndTime

#pragma 添加日期选择器
- (void)addDatePicker
{
_datePicker = [[UIDatePicker alloc] init];
_datePicker.datePickerMode = UIDatePickerModeDateAndTime;
_datePicker.backgroundColor = [UIColor whiteColor];
[_datePicker addTarget:self action:@selector(chooseDate:) forControlEvents:UIControlEventValueChanged];
}

//设置日期格式
- (void)chooseDate:(UIDatePicker *)sender {
NSDate *selectedDate = sender.date;
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"yyyy-MM-dd-HH";
NSString *dateString = [formatter stringFromDate:selectedDate];
_time.text = dateString;
}

//设置键盘和日期选择器的弹出逻辑
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {

//如果当前要显示的键盘,那么把UIDatePicker(如果在视图中)隐藏
if (textField.tag != 1001) {
if (_datePicker.superview) {
[_datePicker removeFromSuperview];
} return YES;
}

//UIDatePicker以及在当前视图上就不用再显示了
if (_datePicker.superview == nil) {
//close all keyboard or data picker visible currently
[_name resignFirstResponder];
[_place resignFirstResponder];
[_other resignFirstResponder];

//此处将Y座标设在最底下,为了一会动画的展示
_datePicker.frame = CGRectMake(0, 480, 320, 216);
[self.view addSubview:_datePicker];

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.3f];
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
_datePicker.frame = CGRectMake(0, 270, 320, 216);
[UIView commitAnimations];
}
return NO;
}


5.键盘遮挡TextField问题

<span style="font-size:14px;">//监听键盘弹出
- (void)registerForKeyboardNotifications
{
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(keyboardWasShown:)
                                                 name:UIKeyboardDidShowNotification object:nil];
    
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(keyboardWasHidden:)
                                                 name:UIKeyboardDidHideNotification object:nil];
}

//键盘弹出时调用
- (void)keyboardWasShown:(NSNotification *)aNotification
{
    if (keyboardShown) return;
    if( _activeField == _other || _activeField == _place)
    {
        [_scrollView setContentOffset:CGPointMake(0.0, _activeField.frame.origin.y - 90) animated:YES];
        keyboardShown = YES;
    }
}

//键盘隐藏时调用
- (void)keyboardWasHidden:(NSNotification*)aNotification
{//获取键盘size
 NSDictionary* info = [aNotification userInfo];
        NSValue* aValue = [info objectForKey:@"UIKeyboardBoundsUserInfoKey"];
        CGSize keyboardSize = [aValue CGRectValue].size;
    
    if (_activeField == _place) {

        [_scrollView setContentOffset:CGPointMake(0.0, _activeField.frame.origin.y-200) animated:YES];
        keyboardShown = NO;
    }
    if (_activeField == _other) {

        [_scrollView setContentOffset:CGPointMake(0.0, _activeField.frame.origin.y-keyboardSize.height) animated:YES];
        keyboardShown = NO;
    }
}

//跟踪活动文本框的方法
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    _activeField = textField;
}

- (void)textFieldDidEndEditing:(UITextField *)textField
{
    _activeField = nil;
}

//点击键盘return按钮键盘隐藏
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    if (_activeField == _place) {
        
        [_scrollView setContentOffset:CGPointMake(0.0, _activeField.frame.origin.y-200) animated:YES];
        keyboardShown = NO;
    }
    if (_activeField == _other) {
        
        [_scrollView setContentOffset:CGPointMake(0.0, _activeField.frame.origin.y-253) animated:YES];
        keyboardShown = NO;
    }
    [textField resignFirstResponder];
    return YES;
}</span><span style="font-size: 18px;">
</span>

6.文件操作

    NSMutableDictionary *dic = [[NSMutableDictionary alloc] init];
    [dic setObject:name forKey:@"name"];
    [dic setObject:time forKey:@"time"];
    [dic setObject:place forKey:@"place"];
    [dic setObject:other forKey:@"other"];
    
//将bool类型转化成NSNumber类型写入字典
    NSNumber *aswitch = [NSNumber numberWithBool:isOn];
    [dic setObject:aswitch forKey:@"aSwitch"];

    [_dicCourse addObject:dic];
    
//获取应用程序沙盒的Documents目录
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
    NSString *plistPath = [paths objectAtIndex:0];
    
//得到完整的文件名
    NSString *filename = [plistPath stringByAppendingPathComponent:@"Course.plist"];
//输入写入<pre name="code" class="objc" style="font-size: 18px;">//_dicCourse是一个装有课程对象字典的数组
[_dicCourse writeToFile:filename atomically:YES];


从文件中读出数据:

- (void)readFile
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
    NSString *plistPath = [paths objectAtIndex:0];
    
//得到完整的文件名
    NSString *filename = [plistPath stringByAppendingPathComponent:@"Course.plist"];
//加载plist文件
    NSArray *array = [NSArray arrayWithContentsOfFile:filename];
//遍历array数组
    for (NSDictionary *dict in array) {
        [_course addObject:[Course courseWithDict:dict]];
        [_dicCourse addObject:dict];
    }
}

7.长按删除手势

- (void)addGesture
{
    UILongPressGestureRecognizer *lpgr = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPress:)];
    lpgr.minimumPressDuration = 1.0; //seconds  设置响应时间
    lpgr.delegate = self;
    [_tableView addGestureRecognizer:lpgr];
}
- (void)handleLongPress:(UILongPressGestureRecognizer *)gestureRecognizer
{   //可以避免重复调用
    if(gestureRecognizer.state == UIGestureRecognizerStateBegan)
    {
<span style="white-space:pre">	</span>//判断点击cell的位置
        CGPoint p = [gestureRecognizer locationInView:_tableView ];
        NSIndexPath *indexPath = [_tableView indexPathForRowAtPoint:p];
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"警告" message:@"是否删除" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定 ", nil];
        [alertView show];
        index = indexPath.row;
    }
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    if (buttonIndex == 1) {
        [_course removeObjectAtIndex:index];
        
        [_dicCourse removeObjectAtIndex:index];
        
        //获取应用程序沙盒的Documents目录
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
        NSString *plistPath = [paths objectAtIndex:0];
        //得到完整的文件名
        NSString *filename = [plistPath stringByAppendingPathComponent:@"Course.plist"];
        //输入写入
        [_dicCourse writeToFile:filename atomically:YES];
        [self.tableView reloadData];
    }
}


8.UIAlertView

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
此方法监听点击AlertView的按钮,需要控制器遵守UIAlertViewDelegate协议,并作为AlertView的代理

9.日期格式和计算

    NSDate *date = [[NSDate alloc] init];
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"yyyy-MM-dd-HH"];
    date = [dateFormatter dateFromString:cell.timeLabel.text];
    
    double time = [date timeIntervalSinceNow];
    int days = time/86400;
    int hours = time/3600 - days*24;
yyyy-MM-dd-HH为日期格式,[date timeIntervalSinceNow]此方法返回从date到现在相差的秒数,下面再经过简单的数学运算转化为天数和小时数。

小结:

早在寒假学长就鼓励我们写博客,说来实在惭愧,这期间一直没有发现博客有这么重要的作用,直到有一天闲来无事翻看龙泽学长的博客,发现与我与学长简直天壤之别,感觉他的水平是我无法企及的。突然感到博客的重要性,一来总结自己的经验,将来翻看要比直接项目方便的多;二来与网友分享自己遇到的问题的好的方法,共同进步;三来来记录自己的学习经历,将来万一成了大神,也好讲述自己学习的心路历程,作为炫耀的资本。(此条yy了一下0.0)。

第一次写博客,没有太多高深的见解,只是将学到的东西做个笔记,随时翻看,加油!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章