Значение не передается между viewControllers - PullRequest
0 голосов
/ 18 февраля 2019

Пытается заставить мои viewControllers отправлять значения из основного viewController в секунду.Я хочу, чтобы это происходило при нажатии кнопки, я собираюсь получить значение от кнопки и передать его в новую форму.Но это просто не работает.

Код для основного ViewController

class ViewController: UIViewController {
override func viewDidLoad() {
    super.viewDidLoad()
}

@IBAction func butClick(_ sender: UIButton) {
    NSLog("Button Pressed : %@",[sender .currentTitle])
    //var tt = [sender .currentTitle]
    // Create the view controller
    let vc = TimesTablesViewController(nibName: "TimesTablesViewController", bundle: nil)
    vc.passedValue = "xx"
    self.performSegue(withIdentifier: "pushSegue", sender: nil)

}
}

Код для второго ViewController с именем TimesTablesViewController:

class TimesTablesViewController: UIViewController {

@IBOutlet weak var titleLabel: UILabel!

var passedValue:String = ""

override func viewDidLoad() {
    super.viewDidLoad()
    titleLabel?.text = "\(passedValue) Times Table"
}

}

Я следовал инструкциям, но не могу решить проблему!Спасибо за любую помощь!

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Я предполагаю, что новый контроллер представления появляется, но вы просто не видите данные.Если это так, вы, очевидно, используете раскадровки.TimesTablesViewController(nibName:bundle:) работает только в том случае, если вы используете XIB / NIB и вручную представляете новый контроллер представления.

Если вы действительно используете раскадровки, упростите свой метод butClick:

@IBAction func butClick(_ sender: UIButton) {
    NSLog("Button Pressed")
    performSegue(withIdentifier: "pushSegue", sender: self)
}

Но реализовать prepare(for:sender:):

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let destination = segue.destination as? TimesTablesViewController {
        destination.passedValue = "xx"
    }
}

Предполагая, что вышеизложенное решает вашу проблему, я мог бы предложить дальнейшее упрощение.Примечательно, что если ваш butClick(_:) метод действительно только вызывает performSegue, вы можете перейти к следующей сцене без какого-либо метода @IBAction:

  • удалить butClick(_:) полностью;
  • удалить соединение между кнопкой и методом butClick в IB на вкладке «Инспектор соединений» на правой панели;и
  • управление -драгом с кнопки, ранее подключенной до butClick(_:) к сцене для TimesTablesViewController.

, что еще больше упростит ваш код.

0 голосов
/ 18 февраля 2019

Заменить

self.performSegue(withIdentifier: "pushSegue", sender: nil)

на

self.present(vc,animated:true,completion:nil)

или (если текущий vc находится внутри кадра)

self.navigationController?.pushViewController(vc,animated:true)

Использование

self.performSegue(withIdentifier: "pushSegue", sender: nil)

подходит для раскадровок, а не для XIBS, и если это ваш случай, вам нужно использовать вышеуказанную строку только внутри действия кнопки с реализацией этого метода внутри исходного кода vc

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "pushSegue"  {
        if let nextViewController = segue.destination as? TimesTablesViewController{
                nextViewController.passedValue = "xx"  
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...