PFFacebookUtils.logInInBackground执行segue报错:视图不在窗口层级
解决PFFacebookUtils登录后执行Segue的窗口层级警告问题
嘿,这个问题我做Facebook登录集成时也踩过!你猜的完全没错——问题根源就是后台线程不能直接操作UI。
问题原因
PFFacebookUtils.logInInBackground(withReadPermissions:)的闭包回调是在后台队列里执行的,而iOS要求所有UI相关操作(包括触发segue、弹出弹窗、更新控件等)必须在主线程中进行。直接在后台闭包里调用segue,就会导致系统抛出“view is not in the window hierarchy”的警告,因为此时当前视图控制器的视图可能还没正确挂载到窗口层级里,或者操作线程不合法。
解决方案
把触发segue的代码包裹在DispatchQueue.main.async里,强制让UI操作回到主线程执行。修改后的代码示例如下:
@IBAction func loginButtonTapped(_ sender: UIButton) { let permissions = ["public_profile", "email"] PFFacebookUtils.logInInBackground(withReadPermissions: permissions) { (user: PFUser?, error: Error?) -> Void in if let user = user { if user.isNew { print("新用户注册成功") } else { print("老用户登录成功") } // 关键:把segue调用放到主线程 DispatchQueue.main.async { self.performSegue(withIdentifier: "YourSegueIdentifier", sender: self) } } else { print("登录失败:\(error?.localizedDescription ?? "未知错误")") } } }
额外提醒
以后碰到任何需要在异步回调里更新UI的场景(比如网络请求回调、第三方SDK回调),都记得先切回主线程,这是iOS开发里的基础规范,能避免很多奇怪的UI异常。
内容的提问来源于stack exchange,提问作者Daewizal Forshizal
相关产品推荐
相关产品推荐

