iOS popToRootViewControllerAnimated无法处理委托方法

时间:2015-03-20 12:50:41

标签: ios swift asynchronous

我实现了一个自定义委托方法,如果某些数据从服务器到达,它应弹出根视图控制器。 通过单击子控制器中的后退按钮,第一种方法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

我希望你能帮我解决这个问题。 非常感谢提前。

2 个答案:

答案 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));