ios 開(kāi)發(fā)中遇見(jiàn)的問(wèn)題及處理方法

記錄一點(diǎn)點(diǎn)小問(wèn)題處理

xcode調(diào)試在release模式下把鉴,控制臺(tái)不打印信息問(wèn)題:

debug模式不要調(diào)整层扶,自動(dòng)可以po出屬性友题。release模式將building setting -> Optimization Level ->release 條件由Fastest, Smallest[-Os] 改成 None[-Oo].
發(fā)布版本的時(shí)候,記得改回來(lái)冷溃,倒數(shù)第二個(gè)哦。

1.一般我們進(jìn)行刷新的下拉時(shí)候巩踏,都會(huì)先清掉數(shù)據(jù)源秃诵,在重新請(qǐng)求數(shù)據(jù),加載數(shù)據(jù)源塞琼; 這時(shí)候你要直接就將數(shù)據(jù)清掉菠净,可能會(huì)引起crash。因?yàn)槟阍谇宓魯?shù)據(jù)源彪杉,視圖還在毅往,內(nèi)部調(diào)用方法就crash了。這時(shí)候要先請(qǐng)求數(shù)據(jù)派近,確認(rèn)數(shù)據(jù)請(qǐng)求到了攀唯,在清掉原來(lái)的數(shù)據(jù),在加載新的數(shù)據(jù)源渴丸。
But t t t ——有的場(chǎng)景就不能這么處理侯嘀,還沒(méi)有l(wèi)oad到新數(shù)據(jù)之前,就必須要把舊的數(shù)據(jù)源清掉谱轨。這樣很容易導(dǎo)致crash戒幔;

我的處理方法是:在清掉數(shù)據(jù)源之后,緊接著刷新一下視圖土童;[self.tableView reloadData]诗茎。這樣就不會(huì)引起crash,具體為什么是這樣献汗,我也不是很清楚敢订,可能relaodData 方法內(nèi)部進(jìn)行什么處理了吧王污。。誰(shuí)知道或是有更好的辦法求告知楚午,感激不盡U哑搿!

2.當(dāng)cell上有動(dòng)畫(huà)時(shí)醒叁,一定要注意動(dòng)畫(huà)完成的block與刷新數(shù)據(jù)方法的調(diào)用順序司浪。
當(dāng)你刷新數(shù)據(jù)方法在動(dòng)畫(huà)完成block之前調(diào)用了,就可能會(huì)出現(xiàn)異常把沼。

解決辦法:用GCD,確保方法的執(zhí)行順序吁伺,block完成之后在調(diào)用數(shù)據(jù)刷新饮睬;添加到隊(duì)列里的方法,會(huì)按著添加的順序執(zhí)行(FIFO)篮奄,這樣就能保證了調(diào)用順序捆愁。
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ //Do Something });

這么寫(xiě)可能不太理解,反正就是要注意動(dòng)畫(huà)完成的block之后在刷新數(shù)據(jù)窟却。如果不能保證這樣的執(zhí)行順序昼丑,就不要在動(dòng)畫(huà)完成那里在處理一些你想做的視圖更新操作。

3.關(guān)于tableView的使用和代理方法

tableView的plain類(lèi)型夸赫,sectionHead 會(huì)有懸停效果菩帝;grouped類(lèi)型,不會(huì)懸停茬腿。

直接用這個(gè)方法設(shè)置頭視圖
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { return @"Title"; }
當(dāng)是plain類(lèi)型時(shí)呼奢,顯示正確;當(dāng)是grouped類(lèi)型時(shí)切平,會(huì)強(qiáng)制轉(zhuǎn)成大寫(xiě)“TITLE”握础。中文沒(méi)有影響。

//響應(yīng)點(diǎn)擊索引時(shí)的委托方法
-(NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index
設(shè)置索引的時(shí)候悴品,這個(gè)代理方法設(shè)置點(diǎn)擊索引跳轉(zhuǎn)的位置禀综。默認(rèn)不寫(xiě)或是直接return index,系統(tǒng)會(huì)自動(dòng)關(guān)聯(lián)索引,自己實(shí)現(xiàn)這個(gè)代理方法可能還出錯(cuò)呢苔严,建議不要實(shí)現(xiàn)這個(gè)方法定枷。

//修改索引字體

- (NSArray<NSString *> *)sectionIndexTitlesForTableView:(UITableView *)tableView
{
    //修改索引顏色
//    tableView.sectionIndexBackgroundColor = [UIColor greenColor];//修改右邊索引的背景色
    tableView.sectionIndexColor = kMainColor;//修改右邊索引字體的顏色
//    tableView.sectionIndexTrackingBackgroundColor = [UIColor orangeColor];//修改右邊索引點(diǎn)擊時(shí)候的背景色
    return self.headerTitles;
}

設(shè)置sectionHeadView

在設(shè)置header和footer信息的時(shí)候,View的優(yōu)先級(jí)高于titile邦蜜。即使你寫(xiě)了title代理方法依鸥,但是你實(shí)現(xiàn)了headView代理方法,這是title代理方法- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section無(wú)效悼沈。

sectionHead或footView 都要注意復(fù)用贱迟,提高效率姐扮,而且還可以在相應(yīng)的代理方法中改變其屬性
- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section { UITableViewHeaderFooterView *vi = (UITableViewHeaderFooterView *)view; vi.textLabel.textColor = [UIColor redColor];//這時(shí)候已經(jīng)拿到了headView 隨意更改它的屬性 }

4.UITableViewDelegate(tableView代理方法)

cell將要顯示時(shí)調(diào)用的方法

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath;

頭視圖將要顯示時(shí)調(diào)用的方法

- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section;

尾視圖將要顯示時(shí)調(diào)用的方法

- (void)tableView:(UITableView *)tableView willDisplayFooterView:(UIView *)view forSection:(NSInteger)section;

和上面的方法對(duì)應(yīng),這三個(gè)方法分別是cell衣吠,頭視圖茶敏,尾視圖已經(jīng)顯示時(shí)調(diào)用的方法

- (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath*)indexPath;
- (void)tableView:(UITableView *)tableView didEndDisplayingHeaderView:(UIView *)view forSection:(NSInteger)section;
- (void)tableView:(UITableView *)tableView didEndDisplayingFooterView:(UIView *)view forSection:(NSInteger)section;

設(shè)置自定義頭視圖和尾視圖

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section;
- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section;

5.尋找第一響應(yīng)者
實(shí)際開(kāi)發(fā)中,經(jīng)常用到第一響應(yīng)者缚俏,做一些特別的操作惊搏。有時(shí)候還不太好找,用Apple 這個(gè)public API忧换,當(dāng)target是nil的時(shí)候恬惯,就會(huì)直接拿到第一響應(yīng)者。
- (BOOL)sendAction:(SEL)action to:(id)target from:(id)sender forEvent:(UIEvent *)event
什么意思呢亚茬?

The object to receive the action message. If target is nil, the app sends the message to the first responder, from whence it progresses up the responder chain until it is handled.
第一響應(yīng)者也參考這個(gè)文章

6.iOS定時(shí)器——GCD定時(shí)器

//系統(tǒng)自帶里這個(gè)快捷創(chuàng)建方式(dispatch_source)酪耳,只需要設(shè)置一個(gè)queue即可。 
- (dispatch_source_t)createGCDTimer {
    dispatch_queue_t queue = dispatch_get_main_queue();
    dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
    dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, 1.0 * NSEC_PER_SEC, 0 * NSEC_PER_SEC);
    dispatch_source_set_event_handler(timer, ^{
        //定時(shí)器開(kāi)始回調(diào)
    });
    dispatch_resume(timer);
    return timer;
}

***********分步創(chuàng)建*****************
 //0.創(chuàng)建一個(gè)隊(duì)列
  dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
 
 //1.創(chuàng)建一個(gè)GCD的定時(shí)器
  /*
   第一個(gè)參數(shù):說(shuō)明這是一個(gè)定時(shí)器
   第四個(gè)參數(shù):GCD的回調(diào)任務(wù)添加到那個(gè)隊(duì)列中執(zhí)行刹缝,如果是主隊(duì)列則在主線程執(zhí)行
   */
  dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
  
//2.設(shè)置定時(shí)器的開(kāi)始時(shí)間碗暗,間隔時(shí)間以及精準(zhǔn)度
  //設(shè)置開(kāi)始時(shí)間,三秒鐘之后調(diào)用
  dispatch_time_t start = dispatch_time(DISPATCH_TIME_NOW,3.0 *NSEC_PER_SEC);
  //設(shè)置定時(shí)器工作的間隔時(shí)間
  uint64_t intevel = 1.0 * NSEC_PER_SEC;
  /*
   第一個(gè)參數(shù):要給哪個(gè)定時(shí)器設(shè)置
   第二個(gè)參數(shù):定時(shí)器的開(kāi)始時(shí)間DISPATCH_TIME_NOW表示從當(dāng)前開(kāi)始
   第三個(gè)參數(shù):定時(shí)器調(diào)用方法的間隔時(shí)間
   第四個(gè)參數(shù):定時(shí)器的精準(zhǔn)度梢夯,如果傳0則表示采用最精準(zhǔn)的方式計(jì)算言疗,如果傳大于0的數(shù)值,則表示該定時(shí)切換i可以接收該值范圍內(nèi)的誤差颂砸,通常傳0
   該參數(shù)的意義:可以適當(dāng)?shù)奶岣叱绦虻男阅?   注意點(diǎn):GCD定時(shí)器中的時(shí)間以納秒為單位(面試)
   */
  dispatch_source_set_timer(timer, start, intevel, 0 * NSEC_PER_SEC);
  
//3.設(shè)置定時(shí)器開(kāi)啟后回調(diào)的方法
  /*
   第一個(gè)參數(shù):要給哪個(gè)定時(shí)器設(shè)置
   第二個(gè)參數(shù):回調(diào)block
   */
  dispatch_source_set_event_handler(timer, ^{
      NSLog(@"------%@",[NSThread currentThread]);
  });

  //4.執(zhí)行定時(shí)器
  dispatch_resume(timer);
  //注意:dispatch_source_t本質(zhì)上是OC類(lèi)噪奄,在這里是個(gè)局部變量,需要強(qiáng)引用
  self.timer = timer;

7.給字符串里的某些指定字符串設(shè)置富文本

 NSString *marketPriceStr = [NSString stringWithFormat:@"¥%.2f", product.marketPrice];
 NSString *showStr = [NSString stringWithFormat:@"¥%.2f %@", product.goodsPrice, marketPriceStr];
//先拿到要設(shè)置富文本字符串的位置  這里就是給showStr字符串里的marketPriceStr這些字設(shè)置富文本
NSRange range = [showStr rangeOfString:marketPriceStr options:NSBackwardsSearch];
//設(shè)置你想要的富文本
 NSDictionary *attr = @{
                           NSFontAttributeName : [UIFont systemFontOfSize:12],
                           NSStrikethroughStyleAttributeName : @(NSUnderlineStyleSingle | NSUnderlinePatternSolid),
                           NSStrikethroughColorAttributeName : [UIColor colorWithRed:230 / 255.0f green:23 / 255.0f blue:115 / 255.0f alpha:1]
                           };
//然后添加富文本 在這個(gè)找到的特殊位置
[showAttrStr addAttributes:attr range:range];

8.關(guān)于iOS通知機(jī)制NSNotificationCenter
通知在iOS開(kāi)發(fā)中很常用沾凄,用于多個(gè)界面的傳值響應(yīng)等梗醇,可以一對(duì)多傳遞。使用唯一注意一點(diǎn)的是:要先addObserver撒蟀,在postNotificationName通知叙谨。 這個(gè)就要注意一下順序了。 只有addObserver這個(gè)界面先出現(xiàn)保屯,在出現(xiàn)postNotification這個(gè)界面手负,當(dāng)你切換到發(fā)通知這個(gè)界面時(shí),前面添加接收通知的界面才會(huì)響應(yīng)通知內(nèi)容姑尺。竟终。。這里要注意的就是這個(gè)順序問(wèn)題

9.KVO 使用
使用不多說(shuō)切蟋,就說(shuō)一個(gè)地方要注意:Keypath的命名不是隨便的统捶,要用你要監(jiān)聽(tīng)的那個(gè)屬性命名,不能錯(cuò)。 而且喘鸟,屬性值發(fā)生變化自動(dòng)調(diào)用KVO的前提是:屬性必須調(diào)用了setter匆绣、getter方法或是KVC方法。 直接_name = "newName"是不可以的什黑。

10.webView獲取js的meta內(nèi)容

//js的標(biāo)簽內(nèi)容
<meta name="attach_title" content="">
<meta name="attach_url" content="">
//UIWebView獲取方法
    NSString *js = @"document.getElementsByName(\"attach_title\")[0].content";
    NSString *attach_title = [self.webView stringByEvaluatingJavaScriptFromString:js];
    
    js = @"document.getElementsByName(\"attach_url\")[0].content";
    NSString *attach_url = [self.webView stringByEvaluatingJavaScriptFromString:js];
//WKWebView的獲取方法
- (void)getWKwebViewCenterDic {
    WEAKSELF;
    [self.wkWebView evaluateJavaScript:@"document.getElementsByName(\"attach_title\")[0].content" completionHandler:^(id result, NSError * _Nullable error) {
        NSString *attach_title = @"";
        if ([result isKindOfClass:[NSString class]]) {
            attach_title = result;
        }
        
        [weakSelf getWebViewJSResult:@{@"title" : attach_title}];
    }];
    
    [self.wkWebView evaluateJavaScript:@"document.getElementsByName(\"attach_url\")[0].content" completionHandler:^(id result, NSError * _Nullable error) {
        NSString *attach_url = @"";
        if ([result isKindOfClass:[NSString class]]) {
            attach_url = result;
        }
        
        [weakSelf getWebViewJSResult:@{@"url" : attach_url}];
    }];
}

iOS 保持界面流暢的技巧
暫時(shí)就這么多崎淳,隨時(shí)發(fā)現(xiàn)隨時(shí)記錄更新。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末愕把,一起剝皮案震驚了整個(gè)濱河市拣凹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌恨豁,老刑警劉巖嚣镜,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異圣絮,居然都是意外死亡祈惶,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)扮匠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人凡涩,你說(shuō)我怎么就攤上這事棒搜。” “怎么了活箕?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵力麸,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我育韩,道長(zhǎng)克蚂,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任筋讨,我火速辦了婚禮埃叭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘悉罕。我一直安慰自己赤屋,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布壁袄。 她就那樣靜靜地躺著类早,像睡著了一般。 火紅的嫁衣襯著肌膚如雪嗜逻。 梳的紋絲不亂的頭發(fā)上涩僻,一...
    開(kāi)封第一講書(shū)人閱讀 51,679評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼逆日。 笑死嵌巷,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的屏富。 我是一名探鬼主播晴竞,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼狠半!你這毒婦竟也來(lái)了噩死?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤神年,失蹤者是張志新(化名)和其女友劉穎已维,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體已日,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡垛耳,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了飘千。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片堂鲜。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖护奈,靈堂內(nèi)的尸體忽然破棺而出缔莲,到底是詐尸還是另有隱情,我是刑警寧澤霉旗,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布痴奏,位于F島的核電站,受9級(jí)特大地震影響厌秒,放射性物質(zhì)發(fā)生泄漏读拆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一鸵闪、第九天 我趴在偏房一處隱蔽的房頂上張望檐晕。 院中可真熱鬧,春花似錦岛马、人聲如沸棉姐。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)伞矩。三九已至,卻和暖如春夏志,著一層夾襖步出監(jiān)牢的瞬間乃坤,已是汗流浹背苛让。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留湿诊,地道東北人狱杰。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像厅须,于是被迫代替她去往敵國(guó)和親仿畸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容