着重记忆

一些iOS开发经验(二)

2016-08-11  本文已影响264人  i得深刻方得S

150.

control reaches end of non-void function  //缺少返回值 return self

151.

id birthday = [MyUtil getNoneNillObject:responseObject[@"childBirthDay"]];//过滤一遍,防止对象中出现空值导致崩溃,一个防崩处理,遇到空值返回一个空的字符串@"",而不是让其遭遇null或nil无法执行 [MyUtil saveObject:birthday forKey:@"childBirthDay"];//保存要根据要求,而不是说把整个字典保存起来

152.setTintColor是控制的navigationController上所有按钮控件的颜色

153.代理遇到“existing instance variable '1' for property '2' whith assign attribute must be _unsafe_unretained”问题时

例:id _dataSource改为id __unsafe_unretained _dataSource;

154.arc自动内存管理,关掉你需要手动释放

155.

[self.dailyAndDietView.upType setTitle:@"疾病种类" forState:UIControlStateNormal]; //设置点击和非点击button的title时

156.[self.view endEditing:YES]; 键盘立马关闭

157.datePicker设置格式

datePickerView.datePicker.datePickerMode = UIDatePickerModeDate;//显示类型(只显示年月日) datePickerView.datePicker.minuteInterval = 30;//分钟间隔 datePickerView.datePicker.minimumDate = [NSDate date];//最小日期

158.

不要这样写:

UIDatePicker *datePicker = [[UIDatePicker alloc] initWithFrame:CGRectMake(0, 0, 300, 200)];

这样写分开写就可以改变大小了:

UIDatePicker *datePicker = [[UIDatePicker alloc] init]; datePicker.frame = CGRectMake(0, 0, 300, 200);

159.时间范围,从当前时间——后面3天

//时间范围,从当前时间——后面3天 // NSData * dateMin = [NSDate date]; self.datePicker.minimumDate = [NSDate date]; NSDate * dateMax = [NSDate dateWithTimeIntervalSinceNow:3*24*60*60];self.datePicker.maximumDate = dateMax; //自动滚回当前日期

160.KVO模式

KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知。简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了。

161.dateFormatter显示格式

[dateFormatter setDateFormat:@"yyyy年MM月dd日 EEEE"];EEEE为星期几,EEE为周几 [dateFormatter setDateFormat:@"yyyy-MM-ddHH:mm:ss"]; [dateFormatter setDateFormat:@"yyyy年MMMMd日"];//MMMM 为xx月,一个d可以省去01日前的0

162.注:Objective-C不支持long double类型。@encode(long double)返回d,与double是一样的。

163.objc_property_t

objc_property_t是表示Objective-C声明的属性的类型,其实际是指向objc_property结构体的指针,其定义如下:

typedef struct objc_property *objc_property_t;

164.使用objc_property_t时报错

#import  objective_c动行时库已经有这样的功能。使用这些方法需要加头文件 objc_property_t

165.先保留一个方法

//修改datePicker的系统控件

unsigned int outCount; int i; objc_property_t *pProperty = class_copyPropertyList([UIDatePicker class], &outCount); for (i = outCount -1; i >= 0; i--) { // 循环获取属性的名字 property_getName函数返回一个属性的名称 NSString *getPropertyName = [NSString stringWithCString:property_getName(pProperty) encoding:NSUTF8StringEncoding]; NSString *getPropertyNameString = [NSString stringWithCString:property_getAttributes(pProperty) encoding:NSUTF8StringEncoding]; //关闭当日高亮属性 SEL selector = NSSelectorFromString(@"setHighlightsToday:"); NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[UIDatePicker instanceMethodSignatureForSelector:selector]]; BOOL no = NO; [invocation setSelector:selector]; [invocation setArgument:&no atIndex:2]; [invocation invokeWithTarget:self.datePicker]; if([getPropertyName isEqualToString:@"textColor"]) { [self.datePicker setValue:kColorPink forKey:@"textColor"]; } NSArray * array = [[NSArray alloc] initWithObjects:getPropertyName, nil]; NSLog(@"%@",array); NSLog(@"%@====%@",getPropertyNameString,getPropertyName); }

166.text对齐格式

[nowPickerShowTimeLabel setTextAlignment:NSTextAlignmentLeft];//左边对齐 //text对齐格式

167.记一个关于datePicker选择日期随滚轮实时变动的方法:

self.datePicker.datePickerMode = UIDatePickerModeDate;//格式 //默认显示 NSDateFormatter * dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"yyyy-MM-dd EEEE"]; NSString * dateString = [dateFormatter stringFromDate:[NSDate date]]; self.dateLabel.text = dateString; [self.datePicker addTarget:self action:@selector(dateChanged:) forControlEvents:UIControlEventValueChanged];//委托 -(void)dateChanged:(id)sender{//动作类 UIDatePicker * control = (UIDatePicker *)sender; NSDate * _date = control.date; NSDateFormatter * dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"yyyy-MM-dd EEEE"]; NSString * dateString = [dateFormatter stringFromDate:_date]; self.dateLabel.text = dateString; }

168.通过日期求星期

//通过日期求星期 -(NSString*)fromDateToWeek:(NSString*)selectDate { NSInteger yearInt = [selectDate substringWithRange:NSMakeRange(0, 4)].integerValue;//取第0~4位 NSInteger monthInt = [selectDate substringWithRange:NSMakeRange(4, 2)].integerValue;//取第4位的后两位 NSIntegerdayInt = [selectDate substringWithRange:NSMakeRange(6, 2)].integerValue;//取第6位的后两位 int c = 20;//世纪 long int y = yearInt -1;//年 long int d = dayInt; long int m = monthInt; int w =(y+(y/4)+(c/4)-2*c+(26*(m+1)/10)+d-1)%7; NSString *weekDay = @""; switch (w) { case 0: weekDay = @"星期日"; break; case 1: weekDay = @"星期一"; break; case 2: weekDay = @"星期二"; break; case 3: weekDay = @"星期三"; break; case 4: weekDay = @"星期四"; break; case 5: weekDay = @"星期五"; break; case 6: weekDay = @"星期六"; break; default: break; } return weekDay; }

169.获取当前年月日,星期

//获取当前年月日,星期 -(int)getCurrentTimeWith:(State)state { NSDate* date = [NSDate date]; NSCalendar* calendar = [NSCalendar currentCalendar]; NSDateComponents* comps = [calendar components:(NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit|NSWeekdayCalendarUnit) fromDate:date]; switch (state) { case year:{ return [comps year]; } break; case month:{ return [comps month]; break; } case day:{ return [comps day]; break; } case week:{return [comps weekday]-1>0?[comps weekday]-1:7; break; } default: break; } } h. #import  #import "InfoView.h" typedef enum{ year=0, month, day, week }State; //似乎是个可以获得日历属性的方法 NSCalendar日历

170.关掉webview的垂直滑动性,把.bounce关掉,可以试试

还有重写了-(void)scrollViewDidScroll:(UIScrollView *)scrollView方法在webview的scrollView的scrollView.contentOffset.y发生改变时,再设回0 就不滑了

171.写的是tableViewCell里面嵌套webview的,先在自定义单元格类的_webview的懒加载里(我用懒加载添加webview的)设置一下tag值,_webView.scrollView.tag = 11;

在-(UITableViewCell )tableView:(UITableView )tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

设置cell.webView.scrollView.delegate = self;

重写

-(void)scrollViewDidScroll:(UIScrollView *)scrollView { if (scrollView.tag == 11) { if (_tableView.contentOffset.y < 634.5) { _tableView.contentOffset = CGPointMake(_tableView.contentOffset.x, _tableView.contentOffset.y + scrollView.contentOffset.y); scrollView.contentOffset = CGPointMake(scrollView.contentOffset.x, 0); } else if (scrollView.contentOffset.y < 0) { _tableView.contentOffset = CGPointMake(_tableView.contentOffset.x, _tableView.contentOffset.y + scrollView.contentOffset.y); scrollView.contentOffset = CGPointMake(scrollView.contentOffset.x, 0); } } }

就实现了Cell里面嵌套webview,同步滑动

基本上除了加载慢一点之外,看不出来最后一行Cell用的是网页

有个问题,当页面全部都是webview,也就是我用来展示webview的自定义Cell占满整个屏幕时,pop回上个界面会崩溃,把pop动画关了就好了,因为时间需要响应

172.画线是一定要在drawRect里面的

在view上划一条直线,用到CGContextSetRGBStrokeColor

CGContextSetRGBStrokeColor(context, 1.0, 1.0, 1.0, 1.0);//画笔颜色设置

173.以后遇到编译的Bug就选择xcode的product的cleran,选择一次之后按住option键,再选择cleran build,基本就可以了

174.记一个机智的方法,可以再安装包的resources里找到软件的所偶icns图标

175.改变字体第几个的方法

//应该是改变字体第几个的方法 NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString:@"点击注册代表您已经同意我们的《用户协议》"]; NSRange strRange = {14,6}; [str addAttribute:NSForegroundColorAttributeName value:[UIColor colorInSkinWithKey:@"useColor1"] range:strRange];  //设置颜色 [str addAttribute:NSUnderlineStyleAttributeName value:[NSNumber numberWithInteger:NSUnderlineStyleSingle] range:strRange]; [_radioButton setAttributedTitle:str forState:UIControlStateNormal];

176.一进入界面的时候会调用tableview的datasource方法,你看是不是数据还没请求到你就使用这个值了

177.一个低级失误

"list" : { "id" : "11c334bc-0c9e-4c20-9b2e-af5e434d4ca7", "childId" : "0535001201500246", "childName" : "姜依霖", "hospitalId" : "0535001", "hospitalName" : "招远市人民医院", "questionTitle" : "大便频繁,不拉肚子", "questionContent" : "宝宝50天,这两天隔两小时就大便,一次就一小坨,肚子不疼,睡觉放屁就拉。醒着也频繁拉。母乳喂养,大便金黄色,宝宝吃睡都正常。以前是一天一次大便,一次拉很多。", "questionType" : "医(疾病防治)", "submitDate" : 1438764312000, "activeFlag" : false, "childAge" : 1, "childAgeName" : "1个月", "readFlag" : false, "sex" : "女", "hasPic" : false } //这个list是个数组,数组里面是字典,因为有key啊,有key就是字典,取这里面值的时候直接根据字典的key取值就可以了

178.限制textFeild输入内容

//限制textFeild输入内容 -//创建 1. phonetext = [[UITextField alloc] initWithFrame:CGRectMake(0, 0, self.bounds.size.width-width, 25)]; ...... //设置相关属性 2.关联上selector. 注意: 事件要forControlEvents:UIControlEventEditingChanged [phonetext addTarget:self action:@selector(changePhoneNumValue) forControlEvents:UIControlEventEditingChanged];//手机号码 3.实现selector -(void)changePhoneNumValue { int MaxLen = 15; NSString* szText = [phonetext text];//把输入的字符给szText if ([phonetext length]> MaxLen)//如果超过规定长度 { phonetext.text = [szText substringToIndex:MaxLen];//将规定长度的字符保留,并重新赋给 szText } }

179.如果有个cell把delega指向了self,销毁时,assign的时候 必须=nil,weak的时候不必。

weak的时候自动销毁 但是设置delegate的时候是assign 在销毁的时候 一定要delegate=nil

那就是在self的dealloc 再找回这个cell 再delegate=nil

当这个cell不用的时候 =nil 出现的时候 =self 这样做 没意义 而且所有的delegate若是assign的话 在控制器销毁的时候 都应该=nil 不然的话,可能在某一个时间点。当这个控制器销毁的时候,app会蹦掉,那时候你找都找不到在那蹦的,蹦的原因是什么所以,一定要在控制器消失的时候,把assign的delegate全部都=ni

180.

-(void)dealloc{ self.delegate = nil; [super dealloc]; }

181.比如说在界面间传值的时候,对类的初始化,是在用的时候初始化,在全局用变量初始化时实际上最后的结果和使用时的类不是同一个东西,所以,在用的时候再初始化

182.一般传值过去为空,都是初始化的原因

183.long型转化为日期,long型就是1970年到要转换的日期的秒数

double theDate = [self.theQuestion[@"submitDate"] doubleValue]/1000; NSDate * date = [NSDate dateWithTimeIntervalSince1970:theDate]; NSDateFormatter * dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"yyyy年MM月dd日"]; NSString * dateString = [dateFormatter stringFromDate:date]; myQuizCell.dateStirng = dateString;

184.那既然仅仅是“更新展示”出已有的数据源,那么为何经常出现这么一个情况,当进行网络请求时,比如将返回数据存放在数组中,在请求内部这个数组是确保拿到了返回的值,确保是有值的,然后在其他地方调用数组时,如果在请求中没有[self.tableView reloadData] ,那么就会造成数组的值为nil,这个是因为异步的原因还是这句话的原因?

可以确定是异步造成的原因,没有加载到数据就开始进行引用,所以需要在引用前就及时的“刷新”数据源,以免造成下面出现空值

185.网络请求成功和失败的返回形式

NSDictionary * parameters = @{@"from":@"ios", @"secretKey":secretKey, @"username":name, @"childId":childId, @"inputDate":date, @"height":height, @"weight":weight}; [AFNetManager postWithUrl:URL_ADDGROWTHMONITOR parameters:parameters success:^(NSURLSessionDataTask *task, id responseObject) { DLog(@"R: %@",responseObject);//这里只是指参数和地址请求成功,并不代表执行成功 } failure:^(NSURLSessionDataTask *task, NSError *error) { DLog(@"E: %@",error);//这里表示url地址请求失败 }];

**186.举个例子,实际上加载的collectionView背景色变成黑色,tableView同理

self.view.backgroundColor 和 self.collectionView.backgroundColor 是不一样的。**

187.view的一些方法使用情况

viewDidLoad-加载视图

viewWillAppear-UIViewController对象的视图即将加入窗口时调用;

viewDidApper-UIViewController对象的视图已经加入到窗口时调用;

viewWillDisappear-UIViewController对象的视图即将消失、被覆盖或是隐藏时调用;

viewDidDisappear-UIViewController对象的视图已经消失、被覆盖或是隐藏时调用;

viewVillUnload-当内存过低时,需要释放一些不需要使用的视图时,即将释放时调用;

viewDidUnload-当内存过低,释放一些不需要的视图时调用

188.设置自定义视图的位置,不要把位置写死

189.//scrlloView使用outLayout约束布局的方法后,设置view的Frame,要使用这个- (void)viewDidLayoutSubviews方法

-(void)viewDidLayoutSubviews { [super viewDidLayoutSubviews]; [self questionView];//视图加载要在这里,而不是viewDidLoad } -(void)questionView{//我要提问 if (self.customView) {//如果有了 就只执行一次 return ; } NSArray * nib = [[NSBundle mainBundle]loadNibNamed:@"QuizView" owner:self options:nil]; self.customView = [nib objectAtIndex:0]; //获得屏幕的Frame // CGRect tmpFrame = [[UIScreen mainScreen] bounds]; //设置自定义视图的位置,不要把位置写死 self.customView.frame= CGRectMake(0, self.tableView.frame.origin.y, 320, self.tableView.frame.size.height);//这里不能写死高度,否则scrollview无法滑动 [self.customView.photoButton addTarget:self action:@selector(selectImage) forControlEvents:UIControlEventTouchUpInside]; }

190.ayoutSubviews是UIView中的属性方法,即只要继承于UIView,就可以使用这个方法,这个方法也很强大,以下是他的触发时机:

1、init初始化不会触发layoutSubviews

2、addSubview会触发layoutSubviews

3、设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化

4、滚动一个UIScrollView会触发layoutSubviews

5、旋转Screen会触发父UIView上的layoutSubviews事件

6、改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件

在这些触发情况下,我们就可以妙用他,比如说改变数据等等,这是个很不错的方法,而且我们也可以手动调用,即

[self setNeedsLayout];

注意:调用layoutSubviews,也需要调用它的父类方法,即

[super layoutSubviews]

传说如果不调用的话会出现奇怪的问题。

191.当scrollView下滑时,底边控件显示不完时,去设置一下constraints的bottom的constans的约束距离就可以了

192.controller的类在传值的时候是不可以直接Init初始化的,而是要用标识符找到。初始化就会造成你找不到它里面本来声明的参数

193.//这句也可以实现去除tableView顶部空白,即放弃自动调整布局(tableView的scrollView属性的自动布局)

self.automaticallyAdjustsScrollViewInsets = NO;//去除tableView顶部空白

194.如果遇到判断字符串不执行便跳过等一系列问题,那么很可能是在转换和执行条件不符上面出了问题

195.在有navigation的界面中,约束出现问题就最好Push一个有navigation的界面,scrollView底部没有撑满时不会滑动,viewController切换界面的时候要找准方法调用的地方

196.在有scrollView的情况下,加在视图的调用还是应该写在viewDidLayoutSubviews里面

197.git在pull出现非冲突性错误而无法正常继续时,:wq

198.用手势比用单一按钮好,方法要科学

199.对于像textField这种不同于Button本身具有点击事件的控件来说,拖一个关联响应事件相当于调用一个其中的代理方法,只有像button那种touch down才是点击,by the way,textFiled的editing did end就是结束编辑时调用的方法,button取消计时器闪烁的效果,把button定义为自定义类型而不是系统类型即可

200.不要去试图判断颜色相等,这是不可靠的

201.传值理解的不够透彻,会很恼火

202.小结一下:

1.关于光标自动跳转到下一行这种事,直接呼出下一行的键盘就可以实现了

2.如果说在调用的方法中有调回主界面之类的方法后,那么就不要再在下面先执行跳转回根视图之类的操作,尤其是异步的时候

3.保存在字典里的KEY的名字和参数的KEY要分清楚

203.可以暂时理解为,刷新view

[self setNeedsDisplay];

204.以下是用来btn逐渐显示出来用的

[UIView beginAnimations:nil context:nil]; [UIView setAnimationDuration:0.01]; [UIView setAnimationDelegate:self]; [UIView setAnimationDidStopSelector:@selector(endAnimation)]; //在这里设置透明度为0,就会慢慢变成0 [UIView commitAnimations];

205.如果需要推送消息,则要到苹果官网上制作证书,再到环信后台制作推送证书.

206.传值拿到nil几乎都是初始化的问题,内存地址未保存

207.当xib找不到Identifier的时候,极有可能是因为你的xib里面包含了cell外面的其他控件

208.在autLayout设置的时候,当第一个设置好约束后,其余的以其为标准进行设置

209.在UILable中lineBreakMode中有以下几个功能

1.NSLineBreakByWordWrapping = 0 //以空格为边界,保留单词,根据计算结果重新设置UILabel的尺寸 。 2.NSLineBreakByCharWrapping //保留整个字符3.NSLineBreakByClipping //简单剪裁,到边界为止 4.NSLineBreakByTruncatingHead //前面部分文字以……方式省略,显示尾部文字内容 5.NSLineBreakByTruncatingTail //结尾部分的内容以……方式省略,显示头的文字内容。 6.NSLineBreakByTruncatingMiddle //中间的内容以……方式省略,显示头尾的文字内容。

210.在tableView的cell当中,取决于section决定的数组,用indexPath.section决定,取决于row的数组,用indexPath.row决定

211.git冲突时,需要删除的是同时修改的部分,而同时添加的不需要删除

212.你要使用第三方,就要为这个第三方工具的bug负责,不要说到时候我改不了这个bug,是第三方的原因云云

213.关闭cell的点击

-(nullable NSIndexPath *)tableView:(UiTableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath 开关开 return indexpath开关关 return nil

214.上拉刷新时需要的逻辑

if([@"success" isEqualToString:value]){ [LCProgressHUD hide]; [self.tableView.pullToRefreshView stopAnimating]; [self.tableView.infiniteScrollingView stopAnimating];  if (self.page == 1) {  self.questionInfo = responseObject[@"rtn"][@"body"][@"list"]; }else{  NSArray * array = responseObject[@"rtn"][@"body"][@"list"];  NSMutableArray * tmpArray = [self.questionInfo mutableCopy];//把之前的保存在可变数组中,可变数组就是长度可以变化就是死的可以添加和删除的  [tmpArray addObjectsFromArray:array];//加载到之前数据的身后  self.questionInfo = [tmpArray copy];//再返回给保存的数组,使tableView的number返回行数发生相应改变  } [self.tableView reloadData]; }

215.BOOL型变量如果不做特别处理,那么其值为no

216.有些开发者,在判断数组是否为空时,会写成:

if (array != nil)

或是: if (array.count != 0)

其实严格来说,这两种写法,都是考虑不足并且不稳定的,并且忽略了一种更常见的情况。

首先来说一下,二者之间的区别。

array == nil

这种情况指的是这个array对象是一个nil对象,而不是一个NSArray类型对象。nil对象是一个可以接收任何消息的对象,它可以赋值给任何一个对象,你对它发消息也没什么问题,尽管你得不到你想要的结果。

array.count == 0

这种情况跟上一种不同的在于,此时的array是一个NSArray类型对象,只不过这个array里面没有元素。但它本身是可以作为NSArray对象来使用的。

而事实上,如果你是处理网络请求的数据,取出的array是nil对象是几乎不可能的(至少我没遇到过),多数情况下会出现的是另一种情况:

取到的array是一个NSNull对象。

NSNull是一个特殊的类,它和nil一样,也代表空值,但二者有区别,NSNull不接收NSArray的那些方法,它只有一个类方法:

+(NSNull *)null;

因此发送NSArray特有的方法或属性访问都会导致程序crash。

我们做空值判断的很大一部分原因就是为了在后台接口数据返回一些异常数据的时候,程序能保证稳定性。

举个例子:某些情况下,后台可能由于各种原因,对某个字段返回了null值,这时我们取到的就是[NSNull null]这样一个对象,再比如说,后台可能对某一个数据取值,但取到了0个,这时返回的是一个空组,我们取到的就是@[],空组。

因此判断数组是否为空,需要对各种情况都进行判断。写法有很多种,比如你可以写成:

if (array != nil && ![array isKindOfClass:[NSNull class]] && array.count != 0)

217.iOS从URL加载图片

+(UIImage *) imageFromURLString: (NSString *) urlstring {  // This call is synchronous and blocking  return [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:urlstring]]]; }

218.上传image图片时要转换成nsdata格式,转换成jpeg内存小,而且最好压缩成0.几的

219.设置datePickerView的最小日期就可以限制上滚功能

220.真的没有技术解决不了的问题,只是自己觉得麻烦懒得去弄罢了

221.在给一个之前在循环中赋值的控件重新赋值时,要在循环当中实时保存这个控件(或者说实时取到这个控件),然后再取出这个控件进行重新赋值

222.在使用git的时候,要看分支名称是否是master,不是就用其他的

223.app默认横屏

在 info.plist 里增加一个属性 Initial interface orientation

值有四个选项分别对应四个方向,选 Landscape 开头的就是横着的

224.clang: error: linker command failed with exit code 1 (use -v to see invocation)

ios开发这个错误一定少不了,现总结如下,一般这三方面的问题,如果不是哪你真可麻烦了

1.引用出错,把*.h弄成了.m,检查一下你的所有引用;

2.再就是你引用第三方的库,你添加文件是系统没有所第三方库的.m文件参入的编译中去,你向项目添加文件得注意了;

3.就是不小心添加的重复的类,向Entity之类,具体你可以看这里http://stackoverflow.com/questions/2264455/iphone-duplicate-symbol-error

顺便说一下http://stackoverflow.com/这个网站是iso开发不可少的一个网站;

4.有些frameworks没有添加进来也会出现上面的问题;

225.关于代缩进

你先按command + [把代码往左缩进到最前面再按command + /注释代码最后按command + ]把代码往右缩进

改为 Tab 缩进(非四个空格),再注释,你们就会发现神奇的对齐了。

226.不要懒不要犹豫不要花时间去做无谓的思考,想到就去做就去写,无论是什么试一试总会知道的,敏捷的思维比什么都重要,比浑浑噩噩的细思缜密要清晰的多。

227.如果是有tableView的界面访问接口,需要储存数据,如NSArray, NSDictionary等,千万不要忘记最重要一步,在接口数据获取成功后加上[self.tableView reloadData];这句话,刷新tableView的数据,否则会造成NSArray或NSDictionary为nil,无法获得返回数据

228.运行之后显示崩溃信息:

Terminating app due to uncaught exception 'NSRangeException', reason: '* -[NSMutableArray objectAtIndex:]: index 2147483647 beyond bounds [0 .. 12]'

数组越界,好好检查代码

229.关于dateFormatter

1)当你的format格式是

NSDateFormatter* dateFormatter = [[[NSDateFormatter alloc] init] autorelease];

[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; // 这里是用大写的 H

NSString* dateStr = [dateFormatter stringFromDate:date];

你获得就是24小时制的。

2)当你的format格式用的是

[dateFormatter setDateFormat:@"yyyy-MM-dd hh:mm:ss"]; // 这里是用小写的 h

你获得的就是12小事制的。

230.大多时候outLayout约束label的时候不需要约束宽度,改变fram就可以了

231.git插件插件没有显示x的时候可以直接pull和push

232.切图是可以切割使其不变形的

233.windows的字体在xcode里字体除以1.8

234.只要cell里的label重写了,是可以直接在controller里给它赋值的

235.记着,改变lable里个别字符的颜色,最重要的一步是

cell.gold.attributedText = attString;

这是在改变label的text,不是直接作用于string

236.数组的count是数组内元素是从1开始的的总体数量,不是数组从0开始的的下标

237.用%@输出,NSInterger转换成整形变量就可以了

cell.day.text = [NSString stringWithFormat:@"%@",@(self.day+1)];

238.如果cell中有特殊类型cell,要优先做判断,否则可能由于条件判断原因(入indexPath.row数量为有限,判断比较值过大时)显示不出来,因为无法执行到该特殊类型的判断所以被略过

239.大多数意外断点停在[indexPath.row]处时,几乎都是由数组越界造成的,因为数组会将indePath.row的所有满足条件执行一遍,会出现indexPath.row大于数组元素数量的情况,即返回行数大于数组数,多余的cell返回行没有数据可执行,而造成崩溃。例:indexPath.row为12,array的元素为10,此时array[indexPath.row]就会造成崩溃。因为一切要以数据为基准

240.要解决cell的复用问题,说白了,就是把判断了的地方再反判断一次,更改了的地方再反更改一次就可以了,上面更改了,下面就也要对这个更改负责

241.想要切割图片,点击右下角的show slicing

242.在-(void)drawRect:(CGRect)rect方法里赋值的时候,基本上相当于写死了,之后再在其他方法里赋值也不会改变,这相当于一开始就给view绘出了的,所以不会改变,这点需要谨慎注意

243.判断星星数量的方法

NSInteger score = [self.array[indexPath.row][@"SCORE"] integerValue]; // CGFloat xoffset = 0.0f;  for (int i = 0; i < 5; i++) {  UIImageView *imgview = (UIImageView *)[cell.contentView viewWithTag:i + 11];  if (i.hidden = NO; } else { imgview.hidden = YES; }//  imgview.hidden = NO; }

244.果然二级运算和一级运算之间还是要加括号的

245.

NSString * theFirst = [answer_phone substringToIndex:3];//截取下标3之前的字符,从0开始

246.Object或Key只能是对象(id或继承自id的),所以字典是不能直接添加整数的

247.

int i = 1; [dic addObject:[NSNumber numberWithInt:i] forKey:@"somekey"];//或者[dic addObject:@1 forKey:@"somekey"];//取出时 i = [[dic objectForKey:@"somekey"] intValue]; //可以不转换成字符串

248.直接输出整数

cell.gold.text = [NSString stringWithFormat:@"%@枚金币", @(goldsNumber)];

249.Decimal Pad实数键盘,包括小数点和数字

上一篇下一篇

猜你喜欢

热点阅读