Swift: перейти к другому ViewController из пользовательского диалога - PullRequest
0 голосов
/ 10 июня 2019

У меня есть Custom Dialog, который возвращается к вызывающей программе, когда я использую Dismiss. Я хочу, чтобы затем вызвать другой ViewController. Я могу сделать это из самого пользовательского диалога или из родительского окна, если смогу обнаружить, что он вернулся.

Как правильно добраться до другого ViewContorller?

Ответы [ 2 ]

0 голосов
/ 11 июня 2019

Я публикую это с большим трепетом. Это, безусловно, немодный ответ. У меня слабое понимание делегатов и протоколов. В его защиту это прямое решение проблемы.

Следующая функция находится в вызывающем ViewController. var dialogSemaphore объявлен как глобальный за пределами класса с начальным значением 3. dialogSemaphore обновляется до 4, когда пользователь нажимает «Сохранить» во всплывающем диалоговом окне и переходит к ViewHistory viewController. Следующая функция () вызывается непосредственно перед запуском диалога. Дополнительная задержка позволяет выполнить любые процедуры до того, как произойдет фактический переход.

    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
    }
}
0 голосов
/ 10 июня 2019

В качестве опции это может быть достигнуто с помощью шаблона делегата. Вот некоторый мета-код:

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, а также выполняете там любую навигацию.

...