Подготовка к функции Segue, которая не передает данные правильно - PullRequest
0 голосов
/ 02 сентября 2018

Метод My prepareForSegue не передает данные в контроллер представления назначения.

var buttonsDictionary = [Int: UIButton]()

func createButtonArray() {
    for item in statTitles {
        let statisticButton = StatButton()

        statisticButton.layer.cornerRadius = 10
        statisticButton.backgroundColor = UIColor.darkGray
        statisticButton.setTitle(String(item.value), for: UIControlState.normal)
        statisticButton.setTitleColor(UIColor.white, for: UIControlState.normal)
        statisticButton.titleLabel?.font = UIFont.systemFont(ofSize: 43)
        statisticButton.titleEdgeInsets = UIEdgeInsetsMake(0, 20, 0, 0)
        statisticButton.contentHorizontalAlignment = .left

        statisticButton.addTarget(self, action: #selector(displayStatDetail), for: .touchUpInside)

        statisticButton.buttonIndex = item.key

        buttonsDictionary[item.key] = (statisticButton) //  Assign value at item.key

        print(statisticButton.buttonIndex)
    }
}

func viewSavedStatistics() {
    for button in buttonsDictionary {
        statisticsView.addArrangedSubview(button.value)
    }
}

@objc func displayStatDetail() {
    self.performSegue(withIdentifier: "StatDetailSegue", sender: UIButton())
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "StatDetailSegue" {
        if let destinationVC = segue.destination as? StatDetailViewController,
            let index = (sender as? StatButton)?.buttonIndex {
            destinationVC.statID = index
            print("Destination STATID: \(destinationVC.statID)")
        }
    }
}

Весь приведенный выше код написан в классе ViewController. StatButton - это пользовательский класс UIButton. Подготовка подразумевает передачу buttonIndex нажатой кнопки, но только передачу 0 и не print, поэтому я не думаю, что она вызывается.

Ответы [ 3 ]

0 голосов
/ 02 сентября 2018

Отправителем является новый экземпляр UIButton, в котором нет нужной вам информации. Вместо этого передайте кнопку, вызывающую селектор.

@objc func displayStatDetail(_ sender: StatisticButton) {
    self.performSegue(withIdentifier: "StatDetailSegue", sender: sender)
}

Вам нужно будет изменить селектор цели, как это в цикле.

statisticButton.addTarget(self, action: #selector(displayStatDetail(_:)), for: .touchUpInside)
0 голосов
/ 02 сентября 2018

Вы ошиблись в функции performSegue, которую вы посылали всегда новому объекту UIButton, а не тому, на который вы щелкнули. Вот что вы должны сделать.

 statisticButton.addTarget(self, action: #selector(displayStatDetail(_ :)), for: .touchUpInside)

@objc func displayStatDetail(_ sender: UIButton) {
    self.performSegue(withIdentifier: "StatDetailSegue", sender: sender)
}
0 голосов
/ 02 сентября 2018

Вы передаете новый экземпляр UIButton как sender здесь:

self.performSegue(withIdentifier: "StatDetailSegue", sender: UIButton())

Вместо этого вы, вероятно, должны иметь там свой statisticButton. У вашего метода выбора цели кнопки может быть параметр - экземпляр кнопки, по которому щелкнул пользователь. Используйте это как sender.

...