Данные обнуляются при переходе от предыдущего View Controller к другому View Controller с помощью Segue - PullRequest
0 голосов
/ 29 августа 2018

Я собираюсь передать данные из ViewController , идущего в другой ViewController , используя segue. При проверке данных (события) от переменной до точки останова в 1st View Controller данные (событие) не равны нулю. Но когда я проверил 2nd View Controller , данные (событие) равны nil . Я запутался, если причина в том, что у меня ошибка в моих кодах или из-за ошибки, появившейся в моей консоли, которая говорит Невозможно вставить COPY_SEND . Надеюсь, я смогу получить некоторую помощь от вас. Спасибо

First View Controller showing the Event and Passcode have Data

Second View Controller showing the Event and Passcode are NIL

Переход от контроллера первого вида

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "DashBoardViewController" {
        let dashBoardController = segue.destination as! DashBoardViewController
        dashBoardController.self.event = event
        dashBoardController.self.passcode = passcode
    }
}

Событие и пароль становятся равными нулю

override func viewDidLoad() {
    super.viewDidLoad()
    guard event != nil, passcode != nil else {
        _ = SCLAlertView(appearance: appearance).showError("No Event Details", subTitle: "There's no event details, please logout and try again")
        return
    }
    showEventDetails()
}

showEventDetails

func showEventDetails() {
    DispatchQueue.main.async{
        self.eventNameLabel.text =  "\(self.event.name.uppercased())"
        self.locationLabel.text =  "\(self.event.location.uppercased())"
        if let dateStringFromDate = getFormattedStringFromDate(date: (self.event.startDateTime), formatString: "MMMM dd, yyyy/ hh:mm a") {
            self.dateTimeLabel.text = dateStringFromDate
        } else {
            self.dateTimeLabel.text = "-"
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Я предполагаю, что вы связали переход, который идет к DashBoardViewController на вашем submitButton от Interface Builder, что означает, что когда вы нажимаете на кнопку submit, вызывается @IBAction func submitButton(_ sender: UIButton) { }, где вы проверяете, если ваш пароль хорошо, и если это так, вы звоните validateEventPasscode(), который вызывает конечную точку API (асинхронно), и только там вы заполняете self.event = event (строка 187 в ViewController.swift).

Теперь, что действительно происходит, так это то, что когда вы связываете переход от кнопки с помощью IB (построителя интерфейса), будет внутренний переход выполнения, который мы должны прекратить, переопределяя следующий метод в ViewController.swift : источник

func shouldPerformSegue(withIdentifier identifier: String, 
                 sender: Any?) -> Bool {
    return false
}

Таким образом, ваш звонок по линии 190 - ViewController.swift:

self.performSegue(withIdentifier: "showEventDashboard", sender: self)

тот, кто стреляет:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
      if segue.identifier == "DashBoardViewController" {
         let dashBoardController = segue.destination as!  DashBoardViewController
         dashBoardController.event = event
         dashBoardController.passcode = passcode
     }
   }

Вы можете проверить мою теорию, поместив три точки останова в ViewController.swift :

  1. строка 134 в validateEventPasscode () из функции submitButton IBAction;
  2. строка 190 в self.performSegue (withIdentifier: "showEventDashboard", sender: self) из validateEventPasscode () func;
  3. строка 108 в dashBoardController.event = событие из функции prepare (для segue, отправителя);

Багги в порядке исполнения: 1, 3, 2 - на данный момент этого можно ожидать, если моя теория верна; Желаемый порядок исполнения: 1, 2, 3.

Короче говоря, вы заполняете self.event после perfomSegue и переходите к следующему экрану , поэтому ваш event равен ноль в следующем VC .

Я использовал в качестве ссылки файл ViewController.swift из вашего репозитория: ViewController.swift

Надеюсь, это поможет, ура!

0 голосов
/ 29 августа 2018

Замените ваш метод prepareForSegue в FirstViewController этим

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "DashBoardViewController" {
        let dashBoardController = segue.destination as! DashBoardViewController
        dashBoardController.event = event
        dashBoardController.passcode = passcode
    }
}

вам не нужно писать

dashBoardController.self.event = event
dashBoardController.self.passcode = passcode

Просто удалите self сверху из двух строк.

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