- 1.上一篇写了应用程序的跳转,然后想写一个具体实现的功能
- 需求:从一个应用程序跳转至另一个控制器的某一界面
- 思路:获取URL再跳转至应用程序,然后再根据一个ID 让Segue跳转至不同界面
- 问题一 : 从哪里获取URL?
- 答:从AppDelegate中的代理方法可以获取
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
}
正式开始项目
- 1.创建一个项目,并且做好相关配置
- 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是没有的,需要自己配置,而配置方法如下
然后就可以运行了
这是运行图
虽然功能是实现了
有木有觉得很奇怪? 一般进入到某一界面然后点击返回,应该是返回上一界面的
猜测:应该是每次跳转的时候没有回到主界面导致的
所以每次跳转之前应该先回到主控制器
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
欢迎一起交流,一起学习
网友评论