Swift4中使用Segue传递数据对象遇窗口不匹配问题求助
看到你遇到的这个报错,我太熟悉了——这通常是因为Segue触发的时机不对,或者视图控制器的view还没正确挂载到window上就尝试跳转导致的。咱们一步步来解决:
错误原因拆解
这个报错的核心是:发起Segue的视图(或者目标视图控制器的view)所在的window和当前活跃的window不匹配。常见场景是你在视图控制器的生命周期早期(比如viewDidLoad)就触发了Segue,这时候view还没被添加到window中,系统就会抛出这个警告。
具体解决方案
调整Segue的触发时机
别在viewDidLoad里调用performSegue(withIdentifier:sender:),换成在viewDidAppear(_:)方法里触发——这个方法执行时,视图已经完全加载到window上了:override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) // 如果需要只触发一次,可以添加判断条件 performSegue(withIdentifier: "setupScreen", sender: self) }规范Segue的数据传递流程
一定要在prepare(for:sender:)方法里完成数据传递,不要直接在触发Segue的地方修改目标控制器的属性——因为此时目标控制器可能还没完成初始化:override func prepare(for segue: UIStoryboardSegue, sender: Any?) { guard segue.identifier == "setupScreen" else { return } // 强转目标控制器为你的setupSudoku类型 guard let setupVC = segue.destination as? setupSudoku else { print("无法转换到setupSudoku控制器") return } // 传递你的对象数据,比如: setupVC.targetData = yourSourceObject }检查Segue标识符一致性
确认Storyboard里Segue的标识符和代码里的setupScreen完全一致,包括大小写——Swift是区分大小写的,这点很容易踩坑。避免手动实例化目标控制器
如果是用Storyboard创建的Segue,不要自己手动初始化setupSudoku实例再跳转,完全交给系统通过Segue来处理,否则会导致目标控制器的view关联到错误的window上。
额外排查点
如果上面的方法还没解决,检查一下有没有其他代码手动把视图添加到了自定义window里,或者修改了视图控制器的view.window属性,这些操作也可能导致window不匹配的问题。
内容的提问来源于stack exchange,提问作者BenjaminSo

