视图控制器是从父视图控制器以模态方式启动的,如果按下其中一个按钮,它将在以后展开:
@IBAction func parentSelected(_ sender: UIButton) {
switch sender.tag {
case 1:
parentType = ParentStoryboardId.meetings
case 2:
parentType = ParentStoryboardId.accounts
case 3:
parentType = ParentStoryboardId.contacts
default:
parentType = ParentStoryboardId.accounts
}
self.performSegue(withIdentifier: "unwindToNotes", sender: self)
}
父VC中的展开segue处理程序然后启动另一个带有条目列表的表VC:
@IBAction func unwindToNotes(sender: UIStoryboardSegue) {
if let sourceViewController = sender.source as? SelectParentVC {
DispatchQueue.main.async {
guard let parentType = sourceViewController.parentType
else {
return
}
self.parentSelected = parentType
self.displayParents(parentType)
self.selectParentView.isHidden = true
}
}
}
最初,在执行父VC中的展开segue处理程序调用的所有UI操作时,我没有指定主队列。虽然调试确认列表VC正在部分执行,但我试图调用的列表视图没有显示。
似乎从unwind segue处理程序调用的一些UI操作被降级为后台线程。我试图弄清楚这是怎么发生的,因为没有一个操作导致"放松"操作是在后台线程上显式运行的。任何见解或链接将非常感谢!
答案 0 :(得分:1)
您的问题不是您没有在主队列上运行。你的问题是当你正在被解雇时,你试图呈现一个新的视图控制器。
使用DispatchQueue.main.async
导致视图控制器的呈现在主runloop的下一次迭代中发生,在前一个视图控制器被解除之后。