iOS界面之間的跳轉(zhuǎn)方式基本有3種。?
創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比南平網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式南平網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋南平地區(qū)。費(fèi)用合理售后完善,十余年實(shí)體公司更值得信賴。
1、改變window的根視圖
[self.window setRootViewController:VC];
2、模態(tài)彈出
[self presentViewController:nextVC? animated:YES completion:nil];//從當(dāng)前界面到nextVC
[self dismissViewControllerAnimated:YES completion:nil];//從nextVC界面回去
3 用 UINavigationController push 進(jìn)來和pop回去
[self.navigationController pushViewController:nextVC animated:YES];//從當(dāng)前界面到nextVC這個(gè)界面
[self.navigationController popViewControllerAnimated:YES];//nextVC這個(gè)界面回到上一界面[self.navigationController popToRootViewControllerAnimated:YES];//回到根視圖界面
//self.navigationController.viewControllers 是一個(gè)數(shù)組里面存放所有之前push過來的界面,如果想要跳回到指定界面 只需要根據(jù)索引值取出響應(yīng)的界面pop回去
MainViewController *MainVC =self.navigationController.viewControllers[1];? ? [self.navigationController popToViewController:MainVC animated:YES];
在iOS開發(fā)中,有時(shí)會(huì)有跳轉(zhuǎn)系統(tǒng)設(shè)置界面的需求,例如提示用戶打開藍(lán)牙或者WIFI,提醒用戶打開推送或者位置權(quán)限等。在iOS6之后,第三方應(yīng)用需要跳轉(zhuǎn)系統(tǒng)設(shè)置界面,需要在URL type中添加一個(gè)Prefs值,如下圖:
需要設(shè)置Prefs
設(shè)置跳轉(zhuǎn)有三種方式,每一種的使用場(chǎng)景都不同。 并且你在跳轉(zhuǎn)到系統(tǒng)中自己應(yīng)用下面設(shè)置的時(shí)候,你的應(yīng)用要提前至少申請(qǐng)了某一個(gè)權(quán)限,如通知,定位等。否則,會(huì)引起崩潰。
當(dāng)iOS系統(tǒng)版本 iOS 10.0 時(shí)
當(dāng)iOS系統(tǒng)版本 =iOS 10.0 時(shí)
當(dāng) iOS系統(tǒng)版本 = iOS7時(shí) , 只能跳轉(zhuǎn)到 系統(tǒng)設(shè)置頁面
當(dāng) iOS系統(tǒng)版本 = iOS8 ,支持跳轉(zhuǎn)到第三方應(yīng)用的設(shè)置界面中
使用prefs:root=bundleID ,bundleID是你第三方應(yīng)用工程的唯一ID
局限性:只支持iOS8,iOS9系統(tǒng),在iOS10系統(tǒng)上,不會(huì)跳轉(zhuǎn)。
在iOS7系統(tǒng)上,僅僅只是跳轉(zhuǎn)到設(shè)置應(yīng)用,不推薦使用。
UIApplicationOpenSettingsURLString字段,是在iOS8上才提供的,支持iOS8,iOS9,iOS10系統(tǒng),推薦使用。
跳轉(zhuǎn)。
而 prefs:root=bundleID和 prefs:root=服務(wù) 都將不起作用。
方式一:prefs:root=某項(xiàng)服務(wù) 適用于 小于 iOS10的系統(tǒng);
方式二:prefs:root=bundleID 適用于 大于等于iOS8系統(tǒng),小于iOS10的系統(tǒng)
方式三:UIApplicationOpenSettingsURLString 適用于 大于等于iOS8的系統(tǒng)
收到推送的準(zhǔn)備:
ios7.0之前
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{
// App 收到推送的通知
ios 8 - 10 點(diǎn)擊本地推送 觸發(fā)的方法
*iOS 8 - 10 點(diǎn)擊遠(yuǎn)程消息推送 *
*iOS10 之后點(diǎn)擊推送的方法 包括本地推送 *
做消息跳轉(zhuǎn)無外乎是在這幾個(gè)方法中,但是上面陳述的這些方法都只是針對(duì)系統(tǒng)版本做的分類,對(duì)于跳轉(zhuǎn)我們還要考慮下其他情況,點(diǎn)擊消息跳轉(zhuǎn)到指定的界面,這個(gè)時(shí)候要分3種情況
app 在前臺(tái)(轉(zhuǎn)本地推送)
=======
我用的是個(gè)推的,在收到個(gè)推的透?jìng)飨r(shí)候會(huì)走這個(gè)代理方法,判斷如果在前臺(tái)的時(shí)候就轉(zhuǎn)成本地推送
這個(gè)是轉(zhuǎn)成本地推送的方法,當(dāng)然對(duì)于里面數(shù)據(jù)的轉(zhuǎn)換你要根據(jù)你們的業(yè)務(wù)需求和后臺(tái)的返回情況做轉(zhuǎn)化,因?yàn)槟阍谥簏c(diǎn)擊本地推送的時(shí)候還是要根據(jù)你轉(zhuǎn)本地推送所傳的值進(jìn)行對(duì)應(yīng)的跳轉(zhuǎn)的
- (void)requestLocationNotification:(NSDictionary *)payData{
app 在前臺(tái)的時(shí)候當(dāng)接收到消息推送的時(shí)候,如果你不做任何處理默認(rèn)是不會(huì)有提示的,一般的處理方式就是透?jìng)鞯南⑥D(zhuǎn)化成本地消息推送,然后當(dāng)用戶點(diǎn)擊的時(shí)候做相應(yīng)的跳轉(zhuǎn),當(dāng)然也有可以直接做彈窗提醒,然后做對(duì)應(yīng)的處理。
iOS 10之前
iOS 10 之后
iOS 7之前
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
iOS 8 - 10
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
ios 10之后
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)())completionHandler
這個(gè)時(shí)候你會(huì)發(fā)現(xiàn) 前臺(tái)后臺(tái)的時(shí)候走的可能是一個(gè)方法,在這里我們就要在方法中做下區(qū)分
希望這篇文章能夠幫到你,總結(jié)的有點(diǎn)亂,有疑問的地方歡迎留言。
嘗試列出所有的頁面跳轉(zhuǎn)方法,有疏漏的歡迎補(bǔ)充。
1.UINavigationController - push pop (常用)
2.UITabBarController
微信的頁面就是一個(gè)UITabBarController 和 NavigationController 合用的例子
3.(Modal)UIViewController - presentView
4.addChildViewController
期待補(bǔ)充
假如有多級(jí)頁面Root-A-B-C的跳轉(zhuǎn),現(xiàn)需要從C返回到A,做法有如下:
有人可能會(huì)說,直接pop兩下就好了,like this:
?錯(cuò)誤姿勢(shì)?:
可以試一試,要是能達(dá)到效果算我輸?。。?/p>
pop到B以后self.navigationController=nil,可以想想是為什么?(頁面pop出去了,導(dǎo)航欄當(dāng)然也跟著出去了,所以下面這個(gè)pop根本不起作用)
?正確姿勢(shì)一:
由上面錯(cuò)誤姿勢(shì)得到啟發(fā),第二個(gè)pop不是不起作用嗎,那就讓B頁面去做pop,通知,代理,block都行
總結(jié):雖然能實(shí)現(xiàn),但是很麻煩,還需要寫清動(dòng)畫YES還是NO,不然pop幾個(gè)都有動(dòng)畫的頁面會(huì)很突兀。
?正確姿勢(shì)二:
利用導(dǎo)航棧的特性,去除導(dǎo)航棧上面的頁面
?正確姿勢(shì)三:
與第二個(gè)類似,但是是從導(dǎo)航棧獲取vc
個(gè)人推薦使用第三種方法,第二種方法直接去除導(dǎo)航棧上面的頁面,怕出現(xiàn)問題,而第三種方式是拿頁面(讀比寫操作安全)。