- 1.上一篇寫了應用程序的跳轉,然后想寫一個具體實現的功能
- 需求:從一個應用程序跳轉至另一個控制器的某一界面
Demo.gif
- 思路:獲取URL再跳轉至應用程序,然后再根據一個ID 讓Segue跳轉至不同界面
- 問題一 : 從哪里獲取URL?
- 答:從AppDelegate中的代理方法可以獲取
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
}
正式開始項目
- 1.創(chuàng)建一個項目,并且做好相關配置
Snip20161119_1.png
- 2.抽出一個跳轉方法
private func openURL(_ URLString : String) {
// 1.獲取對應應用程序的URL
guard let url = URL(string: URLString) else { return }
// 2.判斷URL是否可以打開
guard UIApplication.shared.canOpenURL(url) else { return }
// 3.打開對應的應用程序
UIApplication.shared.openURL(url)
}
- 1."打開微信"按鈕
@IBAction func openWechat() {
openURL("wechat://")
}
- 2."打開微信好友界面"按鈕
@IBAction func openWeChatSession() {
openURL("wechat://session")
}
- 3."打開微信朋友圈界面"按鈕
@IBAction func openWeChatFriend() {
openURL("wechat://timeline")
}
!!最重要的是:配置info.plist
Snip20161119_2.png
第一個項目就完成了,現在開始第二個項目
咳咳,首先搭建好界面
為了方便,我就在Main.storyboard中搭建了
Snip20161119_3.png
Snip20161119_4.png
綁定Segue的ID,通過segue跳轉
Snip20161119_5.png
Snip20161119_6.png
前面說過在ViewController中那么到url,因為我們要通過傳過來的url來判斷跳轉至哪個界面,所以直接來到AppDelegate中
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
//首先,獲取URL對應的URLString
//因為獲取的url是URL類型的,所以我們還需要將其轉為String類型
//absoluteString:絕對路徑的String
let URLString = url.absoluteString
//2.進行判斷,根據不同的URL顯示不同的界面
//我們要通過跟控制器才能跳轉至需要跳轉的界面,所以現在要獲取根控制器
//獲取首頁控制器
let rootNav = window?.rootViewController as? UINavigationController
guard let homeVC = rootNav?.childViewControllers.first else {return false}
//3.進行判斷,根據不同的URL顯示不同的界面
//contains方法是判斷是否包含某一字符串
if URLString.contains("session") {
homeVC.performSegue(withIdentifier: "homeSession", sender: nil)
} else if URLString.contains("timeline"){
homeVC.performSegue(withIdentifier: "homeTimeline", sender: nil)
}
return true
}
另外一個重點來了:(敲黑板)
- 剛創(chuàng)建的項目沒有配置URL Scheme是沒有的,需要自己配置,而配置方法如下
Snip20161119_8.png
然后就可以運行了
這是運行圖
雖然功能是實現了
有木有覺得很奇怪? 一般進入到某一界面然后點擊返回,應該是返回上一界面的
猜測:應該是每次跳轉的時候沒有回到主界面導致的
所以每次跳轉之前應該先回到主控制器
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
//1.獲取首頁控制器
let rootNav = window?.rootViewController as? UINavigationController
//回到主控制器
//在swift中popToRootViewController這個方法有個返回值,但是我們又用不上這個返回值,所以可以用一個占位符 _ 來接收
_ = rootNav?.popToRootViewController(animated: false)
guard let homeVC = rootNav?.childViewControllers.first else {return false}
//2.獲取URL對應的URLString
let URLString = url.absoluteString
//3.進行判斷,根據不同的URL顯示不同的界面
if URLString.contains("session") {
homeVC.performSegue(withIdentifier: "homeSession", sender: nil)
} else if URLString.contains("timeline"){
homeVC.performSegue(withIdentifier: "homeTimeline", sender: nil)
}
return true
}
現在應該沒問題了
Demo3.gif
另外即使應用程序處于后臺,還是關閉狀態(tài)都可以正常執(zhí)行
Demo5.gif
好了,我的分享完了,睡覺咯~~~
我的個人博客 : www.summersam.com
個人微信 : bilibili9310
個人QQ : 276388000
歡迎一起交流,一起學習