如何将Universal Link获取的code参数传递到目标ViewController中
问题原因
你出现报错的核心原因有2个:
- 你当前解析得到的
code是scene(_:continue:)方法内的局部临时变量,仅在该方法的作用域内有效,方法执行完成后就会被销毁。你没有在SceneDelegate类的顶层声明对应的成员属性,所以外部访问sceneDelegate.code自然会提示属性不存在。 - 即使你后续补充了
SceneDelegate的code属性,你当前在viewDidLoad中获取SceneDelegate的方式也存在时机问题:viewDidLoad触发时ViewController的视图还没有完全挂载到Window层级上,self.view.window大概率为nil,最终也拿不到对应的code值。
解决方案
方案1:直接在初始化ViewController时传值(更推荐,逻辑更清晰无歧义)
- 先在
CallbackViewController类中声明用于接收code的属性
class CallbackViewController: UIViewController { // 新增接收code的属性 var code: String? override func viewDidLoad() { super.viewDidLoad() // 直接用self.code即可 print(code ?? "未获取到code") } }
- 在
SceneDelegate初始化ViewController之后,直接把解析到的code赋值过去
修改你scene(_:continue:)方法里的初始化逻辑:
guard let rootVC = storyboard.instantiateViewController(identifier: "CallbackViewController") as? CallbackViewController else { print("ViewController not found") return } // 新增这行,直接传值 rootVC.code = code let rootNC = UINavigationController(rootViewController: rootVC)
方案2:通过SceneDelegate属性传递
如果你坚持要通过访问SceneDelegate的方式获取code,按以下步骤修改:
- 在
SceneDelegate类顶层声明code成员属性
class SceneDelegate: UIResponder, UIWindowSceneDelegate { var window: UIWindow? // 新增全局code属性 var code: String? // 剩下的原有方法不变 func scene(_ scene: UIScene, continue userActivity: NSUserActivity) { // ...原有逻辑 if let code = params.first(where: { $0.name == "code" } )?.value { // 新增这行,把局部code的值存到全局属性 self.code = code // ...剩下的原有逻辑 } } }
- 把ViewController中获取code的逻辑从
viewDidLoad移到viewDidAppear中,此时ViewController已经挂载到Window上,可以正常获取SceneDelegate
override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) if let sceneDelegate = self.view.window?.windowScene?.delegate as? SceneDelegate { let code = sceneDelegate.code print(code ?? "未获取到code") } }
内容的提问来源于stack exchange,提问作者Jon Nicholson
相关产品推荐
相关产品推荐

