经过一个寒假的学习,我对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)。
第一次写博客,没有太多高深的见解,只是将学到的东西做个笔记,随时翻看,加油!