Swift:从自定义对话框切换到另一个视图控制器



我有一个自定义对话框,当我使用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
    }
}

最新更新