我是一名初学者swiftprogrammer,他遇到了函数调用时间问题。我想解释为什么会发生这种情况以及解决问题的方法。问题出现在一个弹出窗口关闭时运行的代码段,我想先打开另一个弹出窗口,然后在新弹出窗口中按下一个按钮后,我希望程序在主视图控制器中另外执行一些操作。这是代码(有人建议使用DispatchQue,但它似乎没有做任何事情):
@objc func onPopupClosed() {
print("first")
DispatchQueue.main.async {
if let vc = self.storyboard?.instantiateViewController (withIdentifier:
"P2CompetitionPopUpId") as? P2_Competition_Pop_Up
{
vc.modalPresentationStyle = .overCurrentContext
self.present(vc, animated: true, completion: nil)
} else {
print("error creating P2_Competion_Pop_Up")
}
}
print ("third")
}
P2_Competition_Pop_Up如下所示:
class P2_Competition_Pop_Up: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
//print("Second")
}
@IBAction func Slot1(_ sender: Any) {
//some code
dismiss(animated: true, completion: nil)
}
}
我希望这个程序能够产生输出"首先" "第二" "第三" (并且只有在弹出窗口中按下按钮后才能打印"第三个")。相反,它给了我"第一" "第三" "第二&#34 ;.为什么?我该如何解决?使用DispatchQue是正确的方法还是另一个?
PS。 "打印("第三")"声明实际上是对主视图外观的修改。我只是用这句话突出了订单难度并简化了插图。
答案 0 :(得分:0)
在您的代码中没有保证,第二个"或"第三"将先打印。
但是,如果您在提交UIViewController
之后想要完成某项内容,则应该在present
完成块中执行此操作。
if let vc = self.storyboard?.instantiateViewController (withIdentifier: "P2CompetitionPopUpId") as? P2_Competition_Pop_Up {
vc.modalPresentationStyle = .overCurrentContext
self.present(vc, animated: true, completion: {
// do it here
print ("third")
})
} else {
print("error creating P2_Competion_Pop_Up")
}
你也可以写糖语法
self.present(vc, animated: true) {
print ("third")
}