我实现了一个自定义委托方法,如果某些数据从服务器到达,它应弹出根视图控制器。
通过单击子控制器中的后退按钮,第一种方法back()
检查是否在文本字段中进行了任何更改,并在出现一些更改时显示UIActionSheet。
1
func back() {
if modified {
let actionSheet = UIActionSheet(title: NSLocalizedString("SAVESETTINGS", comment: "Settings were changed. Do you want to save them?"), delegate: self, cancelButtonTitle: "No", destructiveButtonTitle: "Yes")
actionSheet.actionSheetStyle = .Default
actionSheet.showInView(self.view)
}
else {
self.navigationController?.popToRootViewControllerAnimated(true)
}
}
ActionSheet委托方法发送数据,控制器正在等待答案
的 2
func actionSheet(actionSheet: UIActionSheet, clickedButtonAtIndex buttonIndex: Int) {
if buttonIndex == 0 {
self.socket.send(someData, tag: someTag)
}
else {
self.modified = false
self.navigationController?.popToRootViewControllerAnimated(true)
}
}
委托方法检查是否正确答案在这里并且应该弹出根视图控制器。
第3
func ackReceived(tag: Int32) {
if tag == someTag {
self.navigationController?.popToRootViewControllerAnimated(true)
}
}
如果没有更改或者在UIActionSheet中按下了第二个按钮,则根视图控制器会弹出第一个和第二个方法,但它在3d方法中不起作用。
调用所有方法。
结束了self.navigationController?.popToRootViewControllerAnimated(true)
我还检查了调试器,导航控制器不是nil
。
我希望你能帮我解决这个问题。 非常感谢提前。
答案 0 :(得分:1)
感谢Wain的提示,我发现了这个问题。主队列中未调用func ackReceived(tag: Int32) {}
。
UI作为UIKit方法不是线程安全的,应该在主队列中调用。
func ackReceived(tag: Int32) {
if tag == someTag {
dispatch_async(dispatch_get_main_queue(), {
self.navigationController?.popToRootViewControllerAnimated(true)
return
})
}
}
是调用UI方法的正确方法。
非常感谢你的帮助。
答案 1 :(得分:1)
无效,因为你的导航是零。你可以通过例如print检查它(“mainIconTapped:”+ String(self.navigationController));