iOS 開(kāi)發(fā)中 NavigationController經(jīng)常出現(xiàn)的問(wèn)題原因分析
情況一:
MyViewController *sampleViewController = [[[MyViewController alloc]initWithXXX] autorelease]; [self.navigationController pushViewController: sampleViewController animated:true];
BUG:界面無(wú)反應(yīng)
分析可能出錯(cuò)的原因:
1:self.navigationController為nil,空指針執(zhí)行pushViewController直接跳過(guò),接著sampleViewController會(huì)釋放掉,所以界面會(huì)無(wú)反應(yīng)。
self.navigationController為神馬會(huì)空呢?navigationController是UIViewController父類繼承來(lái)的屬性,不是隨便都能用的,除非你當(dāng)前viewController是被nav push進(jìn)來(lái)的,或者用xib/代碼做成navigationcontroller的root了,cocoa的代碼應(yīng)該是給賦值了。(題外話,我很多界面就是局部用了某個(gè)ViewController,這種情況該viewController的nav為空,如果要正確使用,可以從app取,可以自己賦值,可以整體界面取。。。想咋取都行)
2、self.navigationController為nil,界面掛了
如果你sampleViewController用到了網(wǎng)絡(luò)異步請(qǐng)求,在initWithXXX的時(shí)候會(huì)去取數(shù),那么你10有89會(huì)掛掉。
原因分析:大家網(wǎng)絡(luò)請(qǐng)求,經(jīng)常如下:
TwitterClient *twitterClient = [[TwitterClient alloc] initWithTarget:self action:@selector(XXXReceive:obj:)]; [twitterClient getXXX:param];
恭喜你,這種情況不管是不是navigationController為空,你程序極容易掛掉,原因就是因?yàn)榫W(wǎng)絡(luò)請(qǐng)求我們都會(huì)用異步方式來(lái)拉取數(shù)據(jù),當(dāng)數(shù)據(jù)回來(lái)之后,會(huì)回調(diào)到本類的XXXReceive:obj方法,但是如果界面退出了,數(shù)據(jù)才收到將如何?那就是不是空指針調(diào)用了,TwitterClient里紀(jì)錄的需要回調(diào)的內(nèi)存地址上神馬情況都有可能是,回調(diào)。。杯具了
解決辦法:twitterClient做成成員,在析構(gòu)的時(shí)候該咋收拾twitterClient的就咋收拾一下吧
3、self.navigationController為nil,界面掛了
和上文一樣twitterClient成員了,dealloc也清理了現(xiàn)場(chǎng),還是會(huì)掛
原因分析:異步的問(wèn)題,twitterClient已經(jīng)取到數(shù)據(jù),但是sampleViewController已經(jīng)被釋放了,but dealloc根本沒(méi)來(lái)得及進(jìn)來(lái)。。。
解決辦法,1:確保nav正確,2:盡量在界面viewDidLoad的時(shí)候網(wǎng)絡(luò)請(qǐng)求數(shù)據(jù),在dispear的時(shí)候清理網(wǎng)絡(luò)。
情況二:
reason: 'Pushing a navigation controller is not supported'
報(bào)上面的錯(cuò)誤,原因是:
大家知道,可以將ViewController push到一個(gè) NavigationController中。就像是入棧操作!
將一個(gè)NavigationController再次push到NavigationController中時(shí),報(bào)錯(cuò),出現(xiàn)了
reason: 'Pushing a navigation controller is not supported'的錯(cuò)誤。
應(yīng)該是,NavigationController不支持push進(jìn)來(lái)的對(duì)象是NavigationController吧。
修改方法是:將要進(jìn)入的頁(yè)面不去繼承UINavigationController
情況三:
有時(shí)候項(xiàng)目里會(huì)有一種消息推送, 就是彈出提示用戶消息, 而消息中帶有鏈接, 當(dāng)你點(diǎn)擊連接時(shí)不能跳轉(zhuǎn),這種情況是因?yàn)槟愕膕elf.navigationController = nil 造成的,因?yàn)槟銖棿暗哪莻€(gè)控制器沒(méi)有用UINavigationController包裝
以上所述是小編給大家介紹的iOS 開(kāi)發(fā)中 NavigationController經(jīng)常出現(xiàn)的問(wèn)題原因分析,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
ios通過(guò)SDWebImage實(shí)現(xiàn)圖片加載時(shí)的漸變效果
本篇文章主要介紹了ios通過(guò)SDWebImage實(shí)現(xiàn)圖片加載時(shí)的漸變效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04iOS實(shí)現(xiàn)后臺(tái)長(zhǎng)時(shí)間運(yùn)行
這篇文章主要為大家詳細(xì)介紹了iOS實(shí)現(xiàn)后臺(tái)長(zhǎng)時(shí)間運(yùn)行,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-10-10iOS常見(jiàn)算法以及應(yīng)用知識(shí)點(diǎn)總結(jié)
在本篇文章里小編給大家分享的是關(guān)于iOS常見(jiàn)算法以及應(yīng)用知識(shí)點(diǎn)總結(jié),有興趣的朋友們學(xué)習(xí)下。2019-10-10實(shí)例解析iOS開(kāi)發(fā)中系統(tǒng)音效以及自定義音效的應(yīng)用
這篇文章主要介紹了iOS開(kāi)發(fā)中系統(tǒng)音效以及自定義音效的應(yīng)用,代碼基于傳統(tǒng)的Objective-C,需要的朋友可以參考下2015-10-10iOS實(shí)現(xiàn)微信/QQ顯示最近拍攝圖片的功能實(shí)例代碼
如果你剛剛拍攝了圖片,在使用微信/QQ發(fā)生消息時(shí)會(huì)顯示“你可能要發(fā)送的圖片”,這個(gè)功能非常人性化,怎么實(shí)現(xiàn)的呢?下面小編給大家分享iOS實(shí)現(xiàn)微信/QQ顯示最近拍攝圖片的功能實(shí)例代碼,一起看看吧2017-03-03淺談Xcode 開(kāi)發(fā)工具 XCActionBar
本文主要給大家簡(jiǎn)單講解了Xcode的開(kāi)發(fā)工具 XCActionBar的介紹與使用方法,非常的全面實(shí)用,有需要的小伙伴可以參考下。2015-11-11IOS中NSPredicate和NSRegularExpression校驗(yàn)正則表達(dá)式區(qū)別
本文文章通過(guò)實(shí)例代碼給大家講述了在IOS開(kāi)發(fā)中NSPredicate和NSRegularExpression校驗(yàn)正則表達(dá)式區(qū)別,需要的朋友趕快學(xué)習(xí)下吧。2018-01-01