You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:03:37