Я пытался задать этот вопрос несколькими способами, но не нашел удачи. Трудно сжать мою проблему в одну строку.

Вот где я нахожусь:

  1. viewcontroller1 отправляет переменную ("X" или "Y") в viewcontroller2
  2. viewcontroller2 имеет кнопку.
  3. если переменная отправлена в viewcontroller2 == "x", кнопка на viewcontroller2 должна выполнить переход к viewcontroller3 и отправить свой .title в качестве переменной этому контроллеру представления
  4. если переменная == "y", кнопка на viewcontroller2 должна выполнить переход к viewcontroller4 и отправить свой .title в качестве переменной этому контроллеру представления

Я могу сделать шаги 1 и 2, но не 3 и 4.

Вот где я нахожусь на viewcontroller2:

 @IBAction func didTapButton(_ sender: Any) {
    if sentvar == "X" {
        performSegue(withIdentifier: "ToVC3", sender: self)
    if sentvar == "Y" {
        performSegue(withIdentifier: "ToVC4", sender: self)

Затем ниже в коде я добавил:

  override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if (segue.identifier) == "ToVC3" {
         let newvar = segue.destination as! VC3
        newvar.var = (sender as! UIButton).title(for: .normal)!

Но ... не работает. Я не понимаю, как объединить подготовительный запрос для отправки переменной, а выполнение зависит от ранее отправленной переменной.

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

Спасибо!

0
tfcamp 29 Май 2017 в 00:56

2 ответа

Лучший ответ

Хорошо в вашем viewController2 хранит идентификатор segueIdentifier для viewController3 и viewController4. Также сохраняйте переменную с именем letter. Так что в viewController2 сохраните эти переменные:

var letter = ""
var segueIdentifierThirdVC = "ToVC3"
var segueIdentifierFourthVC = "ToVC4"

Когда вы переходите от ViewController1 к ViewController2, вам нужно передать вышеуказанную переменную letter.

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.destination == "ToVC1" {
        let viewController2 = segue.destination as? ViewController2
        viewController2.letter = // either x or y
    }
}

И затем в вашем ViewController2, когда вы нажимаете кнопку и хотите перейти, вы просто делаете эту проверку:

func buttonClicked() {
    if letter == "x" {
        self.performSegue(withIdentifier: segueIdentifierThirdVC, sender: nil)
    } else if letter == "y" {
        self.performSegue(withIdentifier: segueIdentifierFourthVC, sender: nil)
    }
}

Убедитесь, что вы храните правильные идентификаторы.

< Сильный > Обновление
Чтобы установить метку заголовка в viewController3 и viewController4, выполните следующие действия:

В viewController3 и viewController4 хранится переменная с именем: var title = ""

После того, как вы вызвали функцию buttonClicked в viewController2 и запустили performSegue, вы делаете это:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.destination == "ToVC3" {
        let viewController3 = segue.destination as? ViewController3
        viewController3.title = // pass title to ViewController3
    } else if segue.destination == "ToVC4" {
        let viewController4 = segue.destination as? ViewController4
        viewController4.title = // pass title to ViewController4
    } 
}
1
Rashwan L 28 Май 2017 в 23:00

Я не уверен, что полностью понимаю ваш вопрос.

Но вам нужно будет подготовиться к следующему заявлению.

Пожалуйста, смотрите код ниже.

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if sender == ShowVC {
        let yourVc = segue.destination as? YourViewController
        yourVc?.YOUR_VARIABLE = VariableWithDataFromCurrentVc
    }
}

Можно вызвать с

performSegue(withIdentifier: "ShowVC", sender: self)

Затем вам просто нужно проверить переменную, а затем выполнить переход к правильному VC.

0
Grumme 28 Май 2017 в 22:04