跳轉至應用程序中某一界面(Swift)

  • 1.上一篇寫了應用程序的跳轉,然后想寫一個具體實現的功能
  • 需求:從一個應用程序跳轉至另一個控制器的某一界面
Demo.gif
  • 思路:獲取URL再跳轉至應用程序,然后再根據一個ID 讓Segue跳轉至不同界面
  • 問題一 : 從哪里獲取URL?
  • 答:從AppDelegate中的代理方法可以獲取
 func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
}

正式開始項目

  • 1.創建一個項目,并且做好相關配置
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
    }

另外一個重點來了:(敲黑板)

  • 剛創建的項目沒有配置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

另外即使應用程序處于后臺,還是關閉狀態都可以正常執行

Demo5.gif

好了,我的分享完了,睡覺咯~~~
我的個人博客 : www.summersam.com
個人微信 : bilibili9310
個人QQ : 276388000
歡迎一起交流,一起學習

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容