我有一个自定义对话框,当我使用Dismiss时,它会返回给它的调用者。我希望它调用另一个视图控制器。我可以从自定义对话框本身或父对话框执行此操作,如果我能发现它已返回。
到达另一个ViewContorller的正确方法是什么?
作为一种选择,它可以通过委托模式来实现。这里有一些元代码:
class CallerController: UIViewController {
let dialog: CustomDialog()
func viewDidLoad() {
super.viewDidLoad()
dialog.delegate = self
}
func showDialog() {
dialog.show()
}
}
extension CallerController: CustomDialogDelegate {
func dialogWillDisappear() {
dialog.hide()
// navigate to another view controller here
}
}
protocol CustomDialogDelegate {
func dialogWillDisappear()
}
class CustomDialog {
weak var delegate: CustomDialogDelegate?
func someButtonDidTap() {
delegate.dialogWillDisappear()
}
}
这个想法是:你在caller
中使用对话框进行操作,并在那里执行任何类型的导航。
我非常惶恐地发布这个。这肯定是一个不合时宜的答案。我对代表和协议的理解很弱。在辩护中,它是问题的直接解决方案。
以下函数位于调用 ViewController 中。var dialogSemaphore 声明为类外部的全局,初始值为 3。当用户在弹出对话框中按"保存"时,对话框信号量将更新为 4,并转到 ViewHistory 视图控制器。nextIteration(( 在对话框启动之前调用。额外的延迟允许在实际 segue 发生之前完成任何例程。
func nextIteration() {
print ("dialogSemaphore = (dialogSemaphore)")
switch (dialogSemaphore){
case 3:
DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(1)) {
self.nextIteration()
}// wait 1 sec
break
case 4:
dialogSemaphore = 5
DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(1)) {
self.nextIteration()
}// wait 1 sec
break
case 5:
performSegue(withIdentifier: "SegueToViewHistory", sender: nil)
dialogSemaphore = 3 // back to neutral
break
default:
print ("wtf (dialogSemaphore)")
break
}
}