Подготовка не вызывается Segue (Swift 4.2) - PullRequest
0 голосов
/ 01 января 2019

Я искал ответ здесь, но не смог найти точно такую ​​же проблему, как у меня, пожалуйста, помогите мне разобраться.

Проблема в том, что когда я создаю отдельный вид и пытаюсь создать переход с использованием раскадровки и контроллера представления навигации, сам переход работает нормально, но

override func prepare(for segue: UIStoryboardSegue, sender: Any?)

не вызывается.Чтобы сделать мой пример минимальным, я сделал игрушечное приложение, чтобы показать, что происходит.

Так выглядит общая схема раскадровки. ViewController встроен в NavigationController .

Работа выполняется с помощью Ctrl + SecondViewController, идентификатор установлен .

Пользовательский класс для SecondViewController установлен .

Контроллеры представления имеют следующую реализацию:
Контроллер основного вида устанавливает заголовоктолько кнопка:

class ViewController: UIViewController {

    @IBOutlet weak var button: UIButton!

    override func viewDidLoad() {
        super.viewDidLoad()

        button.setTitle("Awesome title", for: .normal)
    }
}

При нажатии кнопки метка должна обновляться с заголовка кнопки:

class SecondViewController: UIViewController {
    @IBOutlet weak var label: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        print("SecondViewController viewDidLoad method")
    }

    // MARK: - Navigation

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        print(print("SecondViewController prepare method"))
        if let text = (sender as? UIButton)?.titleLabel?.text {
            label.text = text
        }
    }
}

Я намеренно поместил два оператора печати, чтобы показать, что viewDidLoad действительно получаетназывается, но не prepare.

Вот рисунок, показывающий, как работает приложение. Как вы можете видеть, ярлык на втором экране также не обновляется.

Я также пытался установить segue таким образом , затем создать @IBAction функцию и вручную вызвать performSegue:

@IBAction func onButton(_ sender: UIButton) {
    performSegue(withIdentifier: "Id", sender: self)
}

Пожалуйста, помогите мнепонять и решить проблему.Спасибо.

1 Ответ

0 голосов
/ 15 января 2019

Хорошо, я понял, что не так.Для тех, кто все еще смущается тем, как сегменты работают в IOS, взгляните на диаграмму ниже:

Segues в IOS (взято из здесь )

Обратите внимание, что prepare (for: sender) находится в представлении A, а не в представлении B .Это очень важно, поскольку он срабатывает до того, как будет выполнен фактический переход.Более того, если вы присвоите некоторые значения параметру View B (например, UIIMageView), то представление будет отображено с учетом этих изменений.

...