一些iOS開發(fā)經(jīng)驗(yàn)(二)

150.

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

151.

id birthday = [MyUtil getNoneNillObject:responseObject[@"childBirthDay"]];//過濾一遍,防止對(duì)象中出現(xiàn)空值導(dǎo)致崩潰,一個(gè)防崩處理,遇到空值返回一個(gè)空的字符串@"",而不是讓其遭遇null或nil無法執(zhí)行 [MyUtil saveObject:birthday forKey:@"childBirthDay"];//保存要根據(jù)要求,而不是說把整個(gè)字典保存起來

152.setTintColor是控制的navigationController上所有按鈕控件的顏色

153.代理遇到“existing instance variable '1' for property '2' whith assign attribute must be _unsafe_unretained”問題時(shí)

例:id _dataSource改為id __unsafe_unretained _dataSource;

154.arc自動(dòng)內(nèi)存管理,關(guān)掉你需要手動(dòng)釋放

155.

[self.dailyAndDietView.upType setTitle:@"疾病種類" forState:UIControlStateNormal]; //設(shè)置點(diǎn)擊和非點(diǎn)擊button的title時(shí)

156.[self.view endEditing:YES]; 鍵盤立馬關(guān)閉

157.datePicker設(shè)置格式

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.時(shí)間范圍,從當(dāng)前時(shí)間——后面3天

//時(shí)間范圍,從當(dāng)前時(shí)間——后面3天 // NSData * dateMin = [NSDate date]; self.datePicker.minimumDate = [NSDate date]; NSDate * dateMax = [NSDate dateWithTimeIntervalSinceNow:3*24*60*60];self.datePicker.maximumDate = dateMax; //自動(dòng)滾回當(dāng)前日期

160.KVO模式

KVO,即:Key-Value Observing,它提供一種機(jī)制,當(dāng)指定的對(duì)象的屬性被修改后,則對(duì)象就會(huì)接受到通知。簡單的說就是每次指定的被觀察的對(duì)象的屬性被修改后,KVO就會(huì)自動(dòng)通知相應(yīng)的觀察者了。

161.dateFormatter顯示格式

[dateFormatter setDateFormat:@"yyyy年MM月dd日 EEEE"];EEEE為星期幾,EEE為周幾 [dateFormatter setDateFormat:@"yyyy-MM-ddHH:mm:ss"]; [dateFormatter setDateFormat:@"yyyy年MMMMd日"];//MMMM 為xx月,一個(gè)d可以省去01日前的0

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

163.objc_property_t

objc_property_t是表示Objective-C聲明的屬性的類型,其實(shí)際是指向objc_property結(jié)構(gòu)體的指針,其定義如下:

typedef struct objc_property *objc_property_t;

164.使用objc_property_t時(shí)報(bào)錯(cuò)

#import? objective_c動(dòng)行時(shí)庫已經(jīng)有這樣的功能。使用這些方法需要加頭文件 objc_property_t

165.先保留一個(gè)方法

//修改datePicker的系統(tǒng)控件

unsigned int outCount; int i; objc_property_t *pProperty = class_copyPropertyList([UIDatePicker class], &outCount); for (i = outCount -1; i >= 0; i--) { // 循環(huán)獲取屬性的名字 property_getName函數(shù)返回一個(gè)屬性的名稱 NSString *getPropertyName = [NSString stringWithCString:property_getName(pProperty) encoding:NSUTF8StringEncoding]; NSString *getPropertyNameString = [NSString stringWithCString:property_getAttributes(pProperty) encoding:NSUTF8StringEncoding]; //關(guān)閉當(dāng)日高亮屬性 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對(duì)齊格式

[nowPickerShowTimeLabel setTextAlignment:NSTextAlignmentLeft];//左邊對(duì)齊 //text對(duì)齊格式

167.記一個(gè)關(guān)于datePicker選擇日期隨滾輪實(shí)時(shí)變動(dòng)的方法:

self.datePicker.datePickerMode = UIDatePickerModeDate;//格式 //默認(rèn)顯示 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{//動(dòng)作類 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;//世紀(jì) 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.獲取當(dāng)前年月日,星期

//獲取當(dāng)前年月日,星期 -(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; //似乎是個(gè)可以獲得日歷屬性的方法 NSCalendar日歷

170.關(guān)掉webview的垂直滑動(dòng)性,把.bounce關(guān)掉,可以試試

還有重寫了-(void)scrollViewDidScroll:(UIScrollView *)scrollView方法在webview的scrollView的scrollView.contentOffset.y發(fā)生改變時(shí),再設(shè)回0 就不滑了

171.寫的是tableViewCell里面嵌套webview的,先在自定義單元格類的_webview的懶加載里(我用懶加載添加webview的)設(shè)置一下tag值,_webView.scrollView.tag = 11;

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

設(shè)置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); } } }

就實(shí)現(xiàn)了Cell里面嵌套webview,同步滑動(dòng)

基本上除了加載慢一點(diǎn)之外,看不出來最后一行Cell用的是網(wǎng)頁

有個(gè)問題,當(dāng)頁面全部都是webview,也就是我用來展示webview的自定義Cell占滿整個(gè)屏幕時(shí),pop回上個(gè)界面會(huì)崩潰,把pop動(dòng)畫關(guān)了就好了,因?yàn)闀r(shí)間需要響應(yīng)

172.畫線是一定要在drawRect里面的

在view上劃一條直線,用到CGContextSetRGBStrokeColor

CGContextSetRGBStrokeColor(context, 1.0, 1.0, 1.0, 1.0);//畫筆顏色設(shè)置

173.以后遇到編譯的Bug就選擇xcode的product的cleran,選擇一次之后按住option鍵,再選擇cleran build,基本就可以了

174.記一個(gè)機(jī)智的方法,可以再安裝包的resources里找到軟件的所偶icns圖標(biāo)

175.改變字體第幾個(gè)的方法

//應(yīng)該是改變字體第幾個(gè)的方法 NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString:@"點(diǎn)擊注冊(cè)代表您已經(jīng)同意我們的《用戶協(xié)議》"]; NSRange strRange = {14,6}; [str addAttribute:NSForegroundColorAttributeName value:[UIColor colorInSkinWithKey:@"useColor1"] range:strRange];? //設(shè)置顏色 [str addAttribute:NSUnderlineStyleAttributeName value:[NSNumber numberWithInteger:NSUnderlineStyleSingle] range:strRange]; [_radioButton setAttributedTitle:str forState:UIControlStateNormal];

176.一進(jìn)入界面的時(shí)候會(huì)調(diào)用tableview的datasource方法,你看是不是數(shù)據(jù)還沒請(qǐng)求到你就使用這個(gè)值了

177.一個(gè)低級(jí)失誤

"list" : { "id" : "11c334bc-0c9e-4c20-9b2e-af5e434d4ca7", "childId" : "0535001201500246", "childName" : "姜依霖", "hospitalId" : "0535001", "hospitalName" : "招遠(yuǎn)市人民醫(yī)院", "questionTitle" : "大便頻繁,不拉肚子", "questionContent" : "寶寶50天,這兩天隔兩小時(shí)就大便,一次就一小坨,肚子不疼,睡覺放屁就拉。醒著也頻繁拉。母乳喂養(yǎng),大便金黃色,寶寶吃睡都正常。以前是一天一次大便,一次拉很多。", "questionType" : "醫(yī)(疾病防治)", "submitDate" : 1438764312000, "activeFlag" : false, "childAge" : 1, "childAgeName" : "1個(gè)月", "readFlag" : false, "sex" : "女", "hasPic" : false } //這個(gè)list是個(gè)數(shù)組,數(shù)組里面是字典,因?yàn)橛衚ey啊,有key就是字典,取這里面值的時(shí)候直接根據(jù)字典的key取值就可以了

178.限制textFeild輸入內(nèi)容

//限制textFeild輸入內(nèi)容 -//創(chuàng)建 1. phonetext = [[UITextField alloc] initWithFrame:CGRectMake(0, 0, self.bounds.size.width-width, 25)]; ...... //設(shè)置相關(guān)屬性 2.關(guān)聯(lián)上selector. 注意: 事件要forControlEvents:UIControlEventEditingChanged [phonetext addTarget:self action:@selector(changePhoneNumValue) forControlEvents:UIControlEventEditingChanged];//手機(jī)號(hào)碼 3.實(shí)現(xiàn)selector -(void)changePhoneNumValue { int MaxLen = 15; NSString* szText = [phonetext text];//把輸入的字符給szText if ([phonetext length]> MaxLen)//如果超過規(guī)定長度 { phonetext.text = [szText substringToIndex:MaxLen];//將規(guī)定長度的字符保留,并重新賦給 szText } }

179.如果有個(gè)cell把delega指向了self,銷毀時(shí),assign的時(shí)候 必須=nil,weak的時(shí)候不必。

weak的時(shí)候自動(dòng)銷毀 但是設(shè)置delegate的時(shí)候是assign 在銷毀的時(shí)候 一定要delegate=nil

那就是在self的dealloc 再找回這個(gè)cell 再delegate=nil

當(dāng)這個(gè)cell不用的時(shí)候 =nil 出現(xiàn)的時(shí)候 =self 這樣做 沒意義 而且所有的delegate若是assign的話 在控制器銷毀的時(shí)候 都應(yīng)該=nil 不然的話,可能在某一個(gè)時(shí)間點(diǎn)。當(dāng)這個(gè)控制器銷毀的時(shí)候,app會(huì)蹦掉,那時(shí)候你找都找不到在那蹦的,蹦的原因是什么所以,一定要在控制器消失的時(shí)候,把a(bǔ)ssign的delegate全部都=ni

180.

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

181.比如說在界面間傳值的時(shí)候,對(duì)類的初始化,是在用的時(shí)候初始化,在全局用變量初始化時(shí)實(shí)際上最后的結(jié)果和使用時(shí)的類不是同一個(gè)東西,所以,在用的時(shí)候再初始化

182.一般傳值過去為空,都是初始化的原因

183.long型轉(zhuǎn)化為日期,long型就是1970年到要轉(zhuǎn)換的日期的秒數(shù)

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.那既然僅僅是“更新展示”出已有的數(shù)據(jù)源,那么為何經(jīng)常出現(xiàn)這么一個(gè)情況,當(dāng)進(jìn)行網(wǎng)絡(luò)請(qǐng)求時(shí),比如將返回?cái)?shù)據(jù)存放在數(shù)組中,在請(qǐng)求內(nèi)部這個(gè)數(shù)組是確保拿到了返回的值,確保是有值的,然后在其他地方調(diào)用數(shù)組時(shí),如果在請(qǐng)求中沒有[self.tableView reloadData] ,那么就會(huì)造成數(shù)組的值為nil,這個(gè)是因?yàn)楫惒降脑蜻€是這句話的原因?

可以確定是異步造成的原因,沒有加載到數(shù)據(jù)就開始進(jìn)行引用,所以需要在引用前就及時(shí)的“刷新”數(shù)據(jù)源,以免造成下面出現(xiàn)空值

185.網(wǎng)絡(luò)請(qǐng)求成功和失敗的返回形式

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);//這里只是指參數(shù)和地址請(qǐng)求成功,并不代表執(zhí)行成功 } failure:^(NSURLSessionDataTask *task, NSError *error) { DLog(@"E: %@",error);//這里表示url地址請(qǐng)求失敗 }];

**186.舉個(gè)例子,實(shí)際上加載的collectionView背景色變成黑色,tableView同理

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

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

viewDidLoad-加載視圖

viewWillAppear-UIViewController對(duì)象的視圖即將加入窗口時(shí)調(diào)用;

viewDidApper-UIViewController對(duì)象的視圖已經(jīng)加入到窗口時(shí)調(diào)用;

viewWillDisappear-UIViewController對(duì)象的視圖即將消失、被覆蓋或是隱藏時(shí)調(diào)用;

viewDidDisappear-UIViewController對(duì)象的視圖已經(jīng)消失、被覆蓋或是隱藏時(shí)調(diào)用;

viewVillUnload-當(dāng)內(nèi)存過低時(shí),需要釋放一些不需要使用的視圖時(shí),即將釋放時(shí)調(diào)用;

viewDidUnload-當(dāng)內(nèi)存過低,釋放一些不需要的視圖時(shí)調(diào)用

188.設(shè)置自定義視圖的位置,不要把位置寫死

189.//scrlloView使用outLayout約束布局的方法后,設(shè)置view的Frame,要使用這個(gè)- (void)viewDidLayoutSubviews方法

-(void)viewDidLayoutSubviews { [super viewDidLayoutSubviews]; [self questionView];//視圖加載要在這里,而不是viewDidLoad } -(void)questionView{//我要提問 if (self.customView) {//如果有了 就只執(zhí)行一次 return ; } NSArray * nib = [[NSBundle mainBundle]loadNibNamed:@"QuizView" owner:self options:nil]; self.customView = [nib objectAtIndex:0]; //獲得屏幕的Frame // CGRect tmpFrame = [[UIScreen mainScreen] bounds]; //設(shè)置自定義視圖的位置,不要把位置寫死 self.customView.frame= CGRectMake(0, self.tableView.frame.origin.y, 320, self.tableView.frame.size.height);//這里不能寫死高度,否則scrollview無法滑動(dòng) [self.customView.photoButton addTarget:self action:@selector(selectImage) forControlEvents:UIControlEventTouchUpInside]; }

190.ayoutSubviews是UIView中的屬性方法,即只要繼承于UIView,就可以使用這個(gè)方法,這個(gè)方法也很強(qiáng)大,以下是他的觸發(fā)時(shí)機(jī):

1、init初始化不會(huì)觸發(fā)layoutSubviews

2、addSubview會(huì)觸發(fā)layoutSubviews

3、設(shè)置view的Frame會(huì)觸發(fā)layoutSubviews,當(dāng)然前提是frame的值設(shè)置前后發(fā)生了變化

4、滾動(dòng)一個(gè)UIScrollView會(huì)觸發(fā)layoutSubviews

5、旋轉(zhuǎn)Screen會(huì)觸發(fā)父UIView上的layoutSubviews事件

6、改變一個(gè)UIView大小的時(shí)候也會(huì)觸發(fā)父UIView上的layoutSubviews事件

在這些觸發(fā)情況下,我們就可以妙用他,比如說改變數(shù)據(jù)等等,這是個(gè)很不錯(cuò)的方法,而且我們也可以手動(dòng)調(diào)用,即

[self setNeedsLayout];

注意:調(diào)用layoutSubviews,也需要調(diào)用它的父類方法,即

[super layoutSubviews]

傳說如果不調(diào)用的話會(huì)出現(xiàn)奇怪的問題。

191.當(dāng)scrollView下滑時(shí),底邊控件顯示不完時(shí),去設(shè)置一下constraints的bottom的constans的約束距離就可以了

192.controller的類在傳值的時(shí)候是不可以直接Init初始化的,而是要用標(biāo)識(shí)符找到。初始化就會(huì)造成你找不到它里面本來聲明的參數(shù)

193.//這句也可以實(shí)現(xiàn)去除tableView頂部空白,即放棄自動(dòng)調(diào)整布局(tableView的scrollView屬性的自動(dòng)布局)

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

194.如果遇到判斷字符串不執(zhí)行便跳過等一系列問題,那么很可能是在轉(zhuǎn)換和執(zhí)行條件不符上面出了問題

195.在有navigation的界面中,約束出現(xiàn)問題就最好Push一個(gè)有navigation的界面,scrollView底部沒有撐滿時(shí)不會(huì)滑動(dòng),viewController切換界面的時(shí)候要找準(zhǔn)方法調(diào)用的地方

196.在有scrollView的情況下,加在視圖的調(diào)用還是應(yīng)該寫在viewDidLayoutSubviews里面

197.git在pull出現(xiàn)非沖突性錯(cuò)誤而無法正常繼續(xù)時(shí),:wq

198.用手勢比用單一按鈕好,方法要科學(xué)

199.對(duì)于像textField這種不同于Button本身具有點(diǎn)擊事件的控件來說,拖一個(gè)關(guān)聯(lián)響應(yīng)事件相當(dāng)于調(diào)用一個(gè)其中的代理方法,只有像button那種touch down才是點(diǎn)擊,by the way,textFiled的editing did end就是結(jié)束編輯時(shí)調(diào)用的方法,button取消計(jì)時(shí)器閃爍的效果,把button定義為自定義類型而不是系統(tǒng)類型即可

200.不要去試圖判斷顏色相等,這是不可靠的

201.傳值理解的不夠透徹,會(huì)很惱火

202.小結(jié)一下:

1.關(guān)于光標(biāo)自動(dòng)跳轉(zhuǎn)到下一行這種事,直接呼出下一行的鍵盤就可以實(shí)現(xiàn)了

2.如果說在調(diào)用的方法中有調(diào)回主界面之類的方法后,那么就不要再在下面先執(zhí)行跳轉(zhuǎn)回根視圖之類的操作,尤其是異步的時(shí)候

3.保存在字典里的KEY的名字和參數(shù)的KEY要分清楚

203.可以暫時(shí)理解為,刷新view

[self setNeedsDisplay];

204.以下是用來btn逐漸顯示出來用的

[UIView beginAnimations:nil context:nil]; [UIView setAnimationDuration:0.01]; [UIView setAnimationDelegate:self]; [UIView setAnimationDidStopSelector:@selector(endAnimation)]; //在這里設(shè)置透明度為0,就會(huì)慢慢變成0 [UIView commitAnimations];

205.如果需要推送消息,則要到蘋果官網(wǎng)上制作證書,再到環(huán)信后臺(tái)制作推送證書.

206.傳值拿到nil幾乎都是初始化的問題,內(nèi)存地址未保存

207.當(dāng)xib找不到Identifier的時(shí)候,極有可能是因?yàn)槟愕膞ib里面包含了cell外面的其他控件

208.在autLayout設(shè)置的時(shí)候,當(dāng)?shù)谝粋€(gè)設(shè)置好約束后,其余的以其為標(biāo)準(zhǔn)進(jìn)行設(shè)置

209.在UILable中l(wèi)ineBreakMode中有以下幾個(gè)功能

1.NSLineBreakByWordWrapping = 0 //以空格為邊界,保留單詞,根據(jù)計(jì)算結(jié)果重新設(shè)置UILabel的尺寸 。 2.NSLineBreakByCharWrapping //保留整個(gè)字符3.NSLineBreakByClipping //簡單剪裁,到邊界為止 4.NSLineBreakByTruncatingHead //前面部分文字以……方式省略,顯示尾部文字內(nèi)容 5.NSLineBreakByTruncatingTail //結(jié)尾部分的內(nèi)容以……方式省略,顯示頭的文字內(nèi)容。 6.NSLineBreakByTruncatingMiddle //中間的內(nèi)容以……方式省略,顯示頭尾的文字內(nèi)容。

210.在tableView的cell當(dāng)中,取決于section決定的數(shù)組,用indexPath.section決定,取決于row的數(shù)組,用indexPath.row決定

211.git沖突時(shí),需要?jiǎng)h除的是同時(shí)修改的部分,而同時(shí)添加的不需要?jiǎng)h除

212.你要使用第三方,就要為這個(gè)第三方工具的bug負(fù)責(zé),不要說到時(shí)候我改不了這個(gè)bug,是第三方的原因云云

213.關(guān)閉cell的點(diǎn)擊

-(nullable NSIndexPath *)tableView:(UiTableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath 開關(guān)開 return indexpath開關(guān)關(guān) return nil

214.上拉刷新時(shí)需要的邏輯

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];//把之前的保存在可變數(shù)組中,可變數(shù)組就是長度可以變化就是死的可以添加和刪除的? [tmpArray addObjectsFromArray:array];//加載到之前數(shù)據(jù)的身后? self.questionInfo = [tmpArray copy];//再返回給保存的數(shù)組,使tableView的number返回行數(shù)發(fā)生相應(yīng)改變? } [self.tableView reloadData]; }

215.BOOL型變量如果不做特別處理,那么其值為no

216.有些開發(fā)者,在判斷數(shù)組是否為空時(shí),會(huì)寫成:

if (array != nil)

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

其實(shí)嚴(yán)格來說,這兩種寫法,都是考慮不足并且不穩(wěn)定的,并且忽略了一種更常見的情況。

首先來說一下,二者之間的區(qū)別。

array == nil

這種情況指的是這個(gè)array對(duì)象是一個(gè)nil對(duì)象,而不是一個(gè)NSArray類型對(duì)象。nil對(duì)象是一個(gè)可以接收任何消息的對(duì)象,它可以賦值給任何一個(gè)對(duì)象,你對(duì)它發(fā)消息也沒什么問題,盡管你得不到你想要的結(jié)果。

array.count == 0

這種情況跟上一種不同的在于,此時(shí)的array是一個(gè)NSArray類型對(duì)象,只不過這個(gè)array里面沒有元素。但它本身是可以作為NSArray對(duì)象來使用的。

而事實(shí)上,如果你是處理網(wǎng)絡(luò)請(qǐng)求的數(shù)據(jù),取出的array是nil對(duì)象是幾乎不可能的(至少我沒遇到過),多數(shù)情況下會(huì)出現(xiàn)的是另一種情況:

取到的array是一個(gè)NSNull對(duì)象。

NSNull是一個(gè)特殊的類,它和nil一樣,也代表空值,但二者有區(qū)別,NSNull不接收NSArray的那些方法,它只有一個(gè)類方法:

+(NSNull *)null;

因此發(fā)送NSArray特有的方法或?qū)傩栽L問都會(huì)導(dǎo)致程序crash。

我們做空值判斷的很大一部分原因就是為了在后臺(tái)接口數(shù)據(jù)返回一些異常數(shù)據(jù)的時(shí)候,程序能保證穩(wěn)定性。

舉個(gè)例子:某些情況下,后臺(tái)可能由于各種原因,對(duì)某個(gè)字段返回了null值,這時(shí)我們?nèi)〉降木褪荹NSNull null]這樣一個(gè)對(duì)象,再比如說,后臺(tái)可能對(duì)某一個(gè)數(shù)據(jù)取值,但取到了0個(gè),這時(shí)返回的是一個(gè)空組,我們?nèi)〉降木褪茾[],空組。

因此判斷數(shù)組是否為空,需要對(duì)各種情況都進(jìn)行判斷。寫法有很多種,比如你可以寫成:

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圖片時(shí)要轉(zhuǎn)換成nsdata格式,轉(zhuǎn)換成jpeg內(nèi)存小,而且最好壓縮成0.幾的

219.設(shè)置datePickerView的最小日期就可以限制上滾功能

220.真的沒有技術(shù)解決不了的問題,只是自己覺得麻煩懶得去弄罷了

221.在給一個(gè)之前在循環(huán)中賦值的控件重新賦值時(shí),要在循環(huán)當(dāng)中實(shí)時(shí)保存這個(gè)控件(或者說實(shí)時(shí)取到這個(gè)控件),然后再取出這個(gè)控件進(jìn)行重新賦值

222.在使用git的時(shí)候,要看分支名稱是否是master,不是就用其他的

223.app默認(rèn)橫屏

在 info.plist 里增加一個(gè)屬性 Initial interface orientation

值有四個(gè)選項(xiàng)分別對(duì)應(yīng)四個(gè)方向,選 Landscape 開頭的就是橫著的

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

ios開發(fā)這個(gè)錯(cuò)誤一定少不了,現(xiàn)總結(jié)如下,一般這三方面的問題,如果不是哪你真可麻煩了

1.引用出錯(cuò),把*.h弄成了.m,檢查一下你的所有引用;

2.再就是你引用第三方的庫,你添加文件是系統(tǒng)沒有所第三方庫的.m文件參入的編譯中去,你向項(xiàng)目添加文件得注意了;

3.就是不小心添加的重復(fù)的類,向Entity之類,具體你可以看這里http://stackoverflow.com/questions/2264455/iphone-duplicate-symbol-error

順便說一下http://stackoverflow.com/這個(gè)網(wǎng)站是iso開發(fā)不可少的一個(gè)網(wǎng)站;

4.有些frameworks沒有添加進(jìn)來也會(huì)出現(xiàn)上面的問題;

225.關(guān)于代縮進(jìn)

你先按command + [把代碼往左縮進(jìn)到最前面再按command + /注釋代碼最后按command + ]把代碼往右縮進(jìn)

改為 Tab 縮進(jìn)(非四個(gè)空格),再注釋,你們就會(huì)發(fā)現(xiàn)神奇的對(duì)齊了。

226.不要懶不要猶豫不要花時(shí)間去做無謂的思考,想到就去做就去寫,無論是什么試一試總會(huì)知道的,敏捷的思維比什么都重要,比渾渾噩噩的細(xì)思縝密要清晰的多。

227.如果是有tableView的界面訪問接口,需要儲(chǔ)存數(shù)據(jù),如NSArray, NSDictionary等,千萬不要忘記最重要一步,在接口數(shù)據(jù)獲取成功后加上[self.tableView reloadData];這句話,刷新tableView的數(shù)據(jù),否則會(huì)造成NSArray或NSDictionary為nil,無法獲得返回?cái)?shù)據(jù)

228.運(yùn)行之后顯示崩潰信息:

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

數(shù)組越界,好好檢查代碼

229.關(guān)于dateFormatter

1)當(dāng)你的format格式是

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

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

NSString* dateStr = [dateFormatter stringFromDate:date];

你獲得就是24小時(shí)制的。

2)當(dāng)你的format格式用的是

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

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

230.大多時(shí)候outLayout約束label的時(shí)候不需要約束寬度,改變fram就可以了

231.git插件插件沒有顯示x的時(shí)候可以直接pull和push

232.切圖是可以切割使其不變形的

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

234.只要cell里的label重寫了,是可以直接在controller里給它賦值的

235.記著,改變lable里個(gè)別字符的顏色,最重要的一步是

cell.gold.attributedText = attString;

這是在改變label的text,不是直接作用于string

236.數(shù)組的count是數(shù)組內(nèi)元素是從1開始的的總體數(shù)量,不是數(shù)組從0開始的的下標(biāo)

237.用%@輸出,NSInterger轉(zhuǎn)換成整形變量就可以了

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

238.如果cell中有特殊類型cell,要優(yōu)先做判斷,否則可能由于條件判斷原因(入indexPath.row數(shù)量為有限,判斷比較值過大時(shí))顯示不出來,因?yàn)闊o法執(zhí)行到該特殊類型的判斷所以被略過

239.大多數(shù)意外斷點(diǎn)停在[indexPath.row]處時(shí),幾乎都是由數(shù)組越界造成的,因?yàn)閿?shù)組會(huì)將indePath.row的所有滿足條件執(zhí)行一遍,會(huì)出現(xiàn)indexPath.row大于數(shù)組元素?cái)?shù)量的情況,即返回行數(shù)大于數(shù)組數(shù),多余的cell返回行沒有數(shù)據(jù)可執(zhí)行,而造成崩潰。例:indexPath.row為12,array的元素為10,此時(shí)array[indexPath.row]就會(huì)造成崩潰。因?yàn)橐磺幸詳?shù)據(jù)為基準(zhǔn)

240.要解決cell的復(fù)用問題,說白了,就是把判斷了的地方再反判斷一次,更改了的地方再反更改一次就可以了,上面更改了,下面就也要對(duì)這個(gè)更改負(fù)責(zé)

241.想要切割圖片,點(diǎn)擊右下角的show slicing

242.在-(void)drawRect:(CGRect)rect方法里賦值的時(shí)候,基本上相當(dāng)于寫死了,之后再在其他方法里賦值也不會(huì)改變,這相當(dāng)于一開始就給view繪出了的,所以不會(huì)改變,這點(diǎn)需要謹(jǐn)慎注意

243.判斷星星數(shù)量的方法

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.果然二級(jí)運(yùn)算和一級(jí)運(yùn)算之間還是要加括號(hào)的

245.

NSString * theFirst = [answer_phone substringToIndex:3];//截取下標(biāo)3之前的字符,從0開始

246.Object或Key只能是對(duì)象(id或繼承自id的),所以字典是不能直接添加整數(shù)的

247.

int i = 1; [dic addObject:[NSNumber numberWithInt:i] forKey:@"somekey"];//或者[dic addObject:@1 forKey:@"somekey"];//取出時(shí) i = [[dic objectForKey:@"somekey"] intValue]; //可以不轉(zhuǎn)換成字符串

248.直接輸出整數(shù)

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

249.Decimal Pad實(shí)數(shù)鍵盤,包括小數(shù)點(diǎn)和數(shù)字

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容