Swift 4.1:如何将AppDelegate的URL数据传递给自定义ViewController子类
解决Swift 4.1中URL传递到自定义ViewController的问题
嘿,我来帮你搞定这个URL传递的问题!在Swift 4.1里,把application(_:open:options:)方法里的URL传给你的HotSpotRISViewController,有两种实用的方案,根据你的场景来选就好:
方案1:初始化ViewController时直接传参(最直接)
这种适合你在open方法里新建HotSpotRISViewController并设置为根控制器的场景,步骤如下:
第一步:修改自定义ViewController,添加URL属性或自定义初始化方法
先给HotSpotRISViewController加个存储URL的属性,或者写个带URL参数的初始化方法:
class HotSpotRISViewController: UIViewController { // 用来存储传入的URL var incomingURL: URL? // 可选:自定义初始化方法,强制传入URL init(with url: URL) { self.incomingURL = url super.init(nibName: nil, bundle: nil) } // 系统要求的初始化方法,必须实现 required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } override func viewDidLoad() { super.viewDidLoad() // 在这里就可以使用incomingURL做业务处理了 if let url = incomingURL { print("拿到的URL是:\(url)") // 你的后续逻辑,比如解析URL参数、跳转页面等 } } }
第二步:在AppDelegate的open方法里传递URL
直接在创建HotSpotRISViewController的时候把URL传进去:
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any]) -> Bool { self.window = UIWindow(frame: UIScreen.main.bounds) // 用自定义初始化方法传URL let vc = HotSpotRISViewController(with: url) // 或者用默认初始化+设置属性的方式: // let vc = HotSpotRISViewController() // vc.incomingURL = url self.window?.rootViewController = vc self.window?.makeKeyAndVisible() return true }
方案2:用通知中心传递(适合ViewController已存在的场景)
如果你的HotSpotRISViewController已经是根控制器或者已经在导航栈里了,用通知中心来传递URL会更方便:
第一步:在AppDelegate里发送通知
当收到URL时,通过通知中心广播这个URL:
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any]) -> Bool { // 发送通知,把URL作为object传出去 NotificationCenter.default.post( name: NSNotification.Name(rawValue: "ReceivedIncomingURL"), object: url ) return true }
第二步:在自定义ViewController里监听通知
在HotSpotRISViewController里注册通知监听,收到通知后处理URL:
class HotSpotRISViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // 注册通知监听 NotificationCenter.default.addObserver( self, selector: #selector(handleIncomingURL(_:)), name: NSNotification.Name(rawValue: "ReceivedIncomingURL"), object: nil ) } // 处理收到的URL @objc private func handleIncomingURL(_ notification: Notification) { if let url = notification.object as? URL { print("通过通知拿到的URL:\(url)") // 你的业务逻辑 } } // 记得在销毁时移除监听,避免内存泄漏 deinit { NotificationCenter.default.removeObserver(self) } }
两种方案都能解决你的问题,优先选方案1,因为直接传参的方式更清晰,也不用处理通知的移除逻辑~
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

