Использование делегата на VC, который еще не был загружен - PullRequest
0 голосов
/ 19 декабря 2018

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

Я пытаюсь передать строку из одного VC в следующий VC и изменить метку на нем с помощью делегата.Проблема, с которой я сталкиваюсь, заключается в том, что по какой-то причине делегат появляется как ноль.( Я получаю эту ошибку: Поток 1: Неустранимая ошибка: Неожиданно обнаружен ноль при развертывании необязательного значения ) ниже приведены некоторые изображения моего кода, которые помогут вам понять, что я написал

СначалаКод VC:

    @IBAction func nextBtn(_ sender: Any) {
    let newWorkoutVC = storyboard?.instantiateViewController(withIdentifier: "NewWorkoutVC") as! NewWorkoutVC
    if workoutNameTextField.text != ""{
        let workoutName = workoutNameTextField.text!
        nameDelegate.transferText(name: workoutName) //error appears on this line
        present(newWorkoutVC, animated: true, completion: nil)
    } else {
    }
}

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

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    let workoutNameVC = storyboard?.instantiateViewController(withIdentifier: "WorkoutNameVC") as! WorkoutNameVC
    workoutNameVC.nameDelegate = self

вот мое расширение, заставляющее второй VC соответствовать моему делегату.

extension NewWorkoutVC: WorkoutNameDelegate{

func transferText(name: String!) {
    workoutNameLabel.text = name
}

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

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

Если первый VC собирается создать экземпляр и представить второй VC (NewWorkoutVC), «делегат» не нужен для перемещения данных из первогоВК ко второму ВК.В данный момент вы говорите

let newWorkoutVC = storyboard?.instantiateViewController(
                       withIdentifier: "NewWorkoutVC") as! NewWorkoutVC

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

(Однако первый VC не должен пытаться касаться любого из интерфейсов второго VC . Вместо этого он должен установить простое значение свойства, и позволить второму VC подобрать это значение свойства и разобраться со своим собственныминтерфейс, обычно в своем собственном viewDidLoad.)

Так для чего нужен шаблон делегата / протокола?Это в том случае, если второй VC позже должен будет передать информацию back первому VC!Чтобы сделать это возможным, первый VC также, в тот момент, о котором я только что говорил, установит для second VC's delegate свойство self (то есть first VC), так что второй VC будет знать, как перезвонить первому VC.В шаблоне протокола делегата:

  • Свойство делегата , объявленное во втором VC и заданное в качестве ссылки на self первым VC, - это то, какВторой VC знает , кто его делегат.

  • Протокол , определенный вторым VC и принятый первым VC, - это то, какВторой ВК знает , что он может сказать своему делегату.

0 голосов
/ 19 декабря 2018

Для передачи данных в контроллер представления, который вы собираетесь представить, вы не используете делегата.Делегаты обычно используются, когда вы хотите передать данные из VC A в VC, который представил A.

Здесь вы можете просто установить свойство напрямую, так как у вас есть экземпляр (newWorkoutVC) уже:

let newWorkoutVC = storyboard?.instantiateViewController(withIdentifier: "NewWorkoutVC") as! NewWorkoutVC
if workoutNameTextField.text != ""{
    let workoutName = workoutNameTextField.text!
    newWorkoutVC.workoutName = workoutName
    present(newWorkoutVC, animated: true, completion: nil)
}

, где workoutName определено в NewWorkoutVC следующим образом:

var workoutName: String!
override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated: animated)
    workoutNameLabel.text = workoutName
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...