ShouldPerformSegue в iOS и macOS - PullRequest
       0

ShouldPerformSegue в iOS и macOS

0 голосов
/ 05 мая 2020

Я хочу сделать переход только при наличии каких-либо условий. Например, в текстовом поле есть текст.

Сначала я устанавливаю соединение в раскадровке от значка контроллера представления ко второму контроллеру представления. Затем у меня есть кнопка в ViewController.

В iOS это работает хорошо и делает переход только при наличии текста в textField1:

 @IBAction func goTo2(_ sender: UIButton) {
        let str: String? = textField1.text
        if str!.isEmpty {
            print ("text field is empty. Do not do the segue")
        }
        else {
            print ("Do the segue")
            performSegue(withIdentifier: "segueTo2", sender: self)
        }
}

В macOS, если я делаю то же самое , он всегда вызывает переход, даже если в textFiel1 нет текста. Поэтому мне нужно добавить shouldPerformSegue.

В macOS это хорошо работает:

@IBAction func goTo2(_ sender: Any) {
    performSegue(withIdentifier: "segueTo2", sender: self)
}

override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {     
    let str: String? = textField1.stringValue
    if str!.isEmpty {
        print ("it is empty")
        return false
    }
    else {
        return true
    }     
}

В документации Apple говорится, что shouldPerformSegue предназначен для iOS и ma c.

То, что я описал, работает хорошо, но я не понимаю, почему разница между iOS и maOS. Это лучший способ сделать это? кто-нибудь может объяснить почему?

1 Ответ

0 голосов
/ 05 мая 2020

У вас есть два способа проверить, следует ли вам переходить на основе вашего кода.

Метод перехода № 1 (iOS и MacOS)

@IBAction func goTo2(_ sender: UIButton) {   
        if !textField1.text.isEmpty {
            performSegue(withIdentifier: "segueTo2", sender: self)   
        }
        print ("text field is empty. Do not do the segue")
}

Метод перехода № 2 (iOS и MacOS)

@IBAction func goTo2(_ sender: Any) {
    performSegue(withIdentifier: "segueTo2", sender: self)
}

override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {     
    if !textField1.stringValue.isEmpty {
        return true
    }
    print ("it is empty")
    return false  
}

Как видите , оба Method #1 и Method #2, похоже, делают одно и то же, но это не так. В Method #1 вы проверяете, пуст ли он ПЕРЕД переходом. В Method #2 вы проверяете, следует ли переходить ПОСЛЕ вызова перехода.

Любой из этих методов работает, и существует масса обходных путей. Самая большая разница в том, что выполнение Method #1 заставляет вас упускать определенные возможности для запуска других методов, таких как prepareForSegue(...), что означает, что вы можете пропустить событие жизненного цикла. Однако вы все равно можете использовать prepareForSegue(...), просто вы не можете использовать его до срабатывания перехода.

Короче говоря, для ваших целей, исходя из текущего кода, вообще нет смысла использовать Method #2. Если, однако, вам нужно выполнить какую-то функцию ПОСЛЕ перехода, но И все же остановить переход, если какое-то условие не выполняется, вы должны использовать Method #2, но даже это может иметь обходной путь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...