IOS開(kāi)發(fā)中的頁(yè)面跳轉(zhuǎn)

不止在移動(dòng)開(kāi)發(fā)領(lǐng)域,甚至對(duì)于所有的前端開(kāi)發(fā),頁(yè)面跳轉(zhuǎn)都是最基本的場(chǎng)景轉(zhuǎn)換,是開(kāi)發(fā)過(guò)程
中最基本的問(wèn)題。對(duì)于IOS初學(xué)者,push與present是兩種最常用的方式,在開(kāi)發(fā)的逐漸深入過(guò)程
中,需要接觸到APN的推送、網(wǎng)絡(luò)鏈接等等急于URLScheme的高級(jí)跳轉(zhuǎn)方式,隨著開(kāi)發(fā)經(jīng)驗(yàn)的不斷
豐富,將APP中的跳轉(zhuǎn)統(tǒng)一使用URLScheme來(lái)管理不失為一種良好的設(shè)計(jì)。

Push與Present

Push與Present是最基本的兩種轉(zhuǎn)場(chǎng)方式,也是URLScheme等高級(jí)封裝的基礎(chǔ)。兩者最直觀的區(qū)別
就是push的轉(zhuǎn)場(chǎng)效果是自右向左的,其需要UINavigationController的配合使用,present模態(tài)
窗口的默認(rèn)轉(zhuǎn)場(chǎng)效果是自下而上的,兩種的使用方式也有著本質(zhì)區(qū)別。

UIViewController *nextViewController = [[UIViewController alloc] init];
nextViewController.title = @"第二個(gè)界面";
[self.navigationController pushViewController:nextViewController animated:YES];

UIViewController *nextViewController = [[UIViewController alloc] init];
nextViewController.title = @"第二個(gè)界面";
[self presentViewController:nextViewContrller animated:YES completed:nil];

Present方式經(jīng)常被是用來(lái)進(jìn)行字段的填充或者編輯頁(yè)面,Present方式是默認(rèn)沒(méi)有NavigationBar
的,如果需要可以在外面包裹一層UINavigationViewController,如下:

[self presentViewController:[[UINavigationController alloc]
    initWithRootViewController:controller] animated:YES completion:^{
}];

URLScheme

我們?cè)陂_(kāi)發(fā)過(guò)程中,會(huì)遇到四種與跳轉(zhuǎn)相關(guān)的場(chǎng)景,分別是:

  • 外部網(wǎng)頁(yè)場(chǎng)景

    只能通過(guò)AppDelegate中事件去獲取對(duì)應(yīng)的URL進(jìn)行匹配。

  • Push推送場(chǎng)景

    通過(guò)AppDelegate中的事件去獲取數(shù)據(jù),取出鏈接字段,然后自定義一個(gè)URL,就可以實(shí)現(xiàn)
    跳轉(zhuǎn)了。

  • 內(nèi)部網(wǎng)頁(yè)場(chǎng)景

    UIWebView在內(nèi)部打開(kāi)URL,如果要在網(wǎng)頁(yè)中跳轉(zhuǎn)APP頁(yè)面,有兩種方法:一種是使用JSBridge,
    js調(diào)用native的handler,跳到相關(guān)頁(yè)面;二是直接使用url來(lái)跳轉(zhuǎn),原理同情景一。

  • 應(yīng)用內(nèi)點(diǎn)擊跳轉(zhuǎn)

    最普通的打開(kāi)方式,也同樣可以抽離一個(gè)URLScheme匹配器去匹配打開(kāi)。

上面總結(jié)了四種場(chǎng)景,如果對(duì)于新手來(lái)說(shuō),可能會(huì)每一種場(chǎng)景寫一遍跳轉(zhuǎn)代碼,這樣即低效又
難以維護(hù),高手會(huì)選擇將這四種場(chǎng)景盡量融合為一種URLScheme,然后使用URL匹配器統(tǒng)一打開(kāi)。

由于URLScheme的多功能性,需要給URLScheme定義一個(gè)類:

@interface MYURLObject : NSObject
    @property MYURLType type;
    NSDictionary *params;
@end

當(dāng)然還需要一個(gè)Route類,該類最好能同時(shí)處理MYURLObject和urlString,其API如下:

+ (void)navigateWithURLObject:(LNURLObject *)obj;
+ (void)navigateToURL:(NSString *)url fromViewController:(UIViewController *)controller;

由于前面所說(shuō)的前三個(gè)場(chǎng)景均是需要使用urlString來(lái)跳轉(zhuǎn),所以需要一個(gè)將urlString轉(zhuǎn)化為
MYURLObject的類,其API為:

+ (MYURLObject *)convertToURLObject:(NSString *)url;

這樣一個(gè)URL匹配器就搭建完成了,在寫跳轉(zhuǎn)代碼的時(shí)候,請(qǐng)優(yōu)先考慮URLScheme。

最后編輯于
?著作權(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),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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