Как передать тег UIButton (Int) другому ViewController с помощью prepareForSegue (Swift 4, Xcode 9) - PullRequest
0 голосов
/ 16 сентября 2018

Я создаю приложение для iOS с двумя ViewControllers, первое из которых StartViewController.swift , второе ViewController.swift .

StartViewController показывает количество9 кнопок UIB, каждому из которых я назначил отдельный тег в инспекторе атрибутов XCode, а именно целые числа от 0 до 8.

Каждая кнопка представляет некоторую тему, о которой пользователь хотел бы узнать больше.Соответственно, в моем проекте есть еще один файл, в котором я создал массив заголовков и соответствующих текстов, представляющих соответствующую информацию, которую я хочу показать пользователю.Второй VC (ViewController.swift) имеет 2 UILabels, которые показывают заголовок и текст соответственно.

Короче говоря, я хочу взять тег кнопки (Int) и использовать ist для вывода информации о теме с соответствующим индексомв моем массиве.

Я подключил оба VC с UIStoryboardSegue, который я назвал startToTopicSegue .Затем я реализовал метод prepare (для segue:) и настроил кнопки.С помощью операторов печати я подтвердил, что 1) sender.tag в StartViewController.swift действительно является тегом нажатой кнопки, и 2) что переменная tagPassedOver устанавливает заголовок и текстовые метки в ViewController.swift, как и должно быть.

Но на tagPassedOver совсем не влияет то, что я указал в viewDidLoad (), вместо этого он сохраняет значение init 0 - как мне это изменить?

У меня сильное чувство, что оно что-то имеетделать со спецификацией отправителя в первом VC, но сейчас я как бы теряюсь в переводе, поэтому любая помощь будет оценена;) - спасибо!

StartViewController.swift

@IBAction func buttonPressed(_ sender: UIButton) {
    print(sender.tag)

    performSegue(withIdentifier: "startToTopicSegue", sender: UIButton.self)
}

func prepare(for segue: UIStoryboardSegue, sender: AnyObject) {
    if segue.identifier == "startToTopicSegue"{
        let destinationVC = segue.destination as! ViewController
        destinationVC.tagPassedOver = sender.tag
    }
}

ViewController.swift

var tagPassedOver : Int = 0

@IBOutlet weak var headingLabel: UILabel!
@IBOutlet weak var textLabel: UILabel!

override func viewDidLoad() {

    headingLabel.text = allTopics.list[tagPassedOver].topicHeading
    textLabel.text = allTopics.list[tagPassedOver].topicText

Ответы [ 3 ]

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

Вы можете отправить значение Int тега в аргументе отправителя

performSegue(withIdentifier: "startToTopicSegue", sender: sender.tag)

и привести отправителя к значению Int в методе подготовки

destinationVC.tagPassedOver = sender as! Int
0 голосов
/ 16 сентября 2018

В качестве ответа на ответ Ракешы Шастри, я бы предложил использовать следующий формат кода при реализации метода prepare(for:sender:) segue

func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if 
       let destination = segue.destination as? ViewController,
       let button = sender as? UIButton {
            destinationVC.tagPassedOver = button.tag
        }
    }
}

Это позволяет использовать базовую функциональность опциональных компонентов путем безопасного развертывания segueпункт назначения, а не проверка идентификатора segue, а затем принудительное развертывание пункта назначения.

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

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

@IBAction func buttonPressed(_ sender: UIButton) { 
    print(sender.tag)
    performSegue(withIdentifier: "startToTopicSegue", sender: sender) // You have required button in sender, so pass that as sender
}

И в методе prepare приведите отправителя к UIButton и получите его.

func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "startToTopicSegue"{
        let destinationVC = segue.destination as! ViewController
        if let button = sender as? UIButton {
            destinationVC.tagPassedOver = button.tag
        }
    }
}
...