Как я могу кодировать заголовок UIButton для изменения на двух контроллерах представления? - PullRequest
0 голосов
/ 20 февраля 2020

Это то, что у меня есть, но оно не работает. Я хочу, чтобы кнопка на vc3 меняла заголовок в зависимости от того, какое изображение отображается на VC2

@IBAction func buttonPressed(_ sender: UIButton) {

    func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if imageDisplayed == UIImage(named: "sad") && segue.identifier == "goToActive"{
        let vc3 = segue.destination as! ThirdViewController
            vc3.buttonTitle.titleLabel?.text = "no"
    }
else if imageDisplayed == UIImage(named: "happy") && segue.identifier == "goToActive" {
let vc3 = segue.destination as! ThirdViewController
    vc3.buttonTitle.titleLabel?.text = "happy"


} }

Ответы [ 2 ]

0 голосов
/ 20 февраля 2020

Прежде всего, создайте свойство с именем text в вашем ThirdViewController и установите его как buttonTitle's title в viewDidLoad() следующим образом:

class ThirdViewController: UIViewController {
    @IBOutlet weak var buttonTitle: UIButton!
    var text: String?

    override func viewDidLoad() {
        super.viewDidLoad()
        self.buttonTitle.setTitle(self.text, for: .normal)
    }
}

Это потому, что IBOutlet не будет установлен, пока не будет вызван viewDidLoad(). Таким образом, доступ к button в vc2 приведет к исключению времени выполнения.

Далее ваш SecondViewController должен выглядеть следующим образом:

class SecondViewController: UIViewController {
    @IBOutlet weak var imageView: UIImageView!

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let vc3 = segue.destination as? ThirdViewController {
            var buttonTitle: String?
            switch self.imageView.image {
            case UIImage(named: "sad"): buttonTitle = "no"
            case UIImage(named: "happy"): buttonTitle = "happy"
            default: break
            }
            vc3.text = buttonTitle
        }
    }
}

В приведенном выше коде

  1. В prepare(for:sender:) установите text из vc3 согласно imageView's image.

  2. Нет необходимости создавать buttonPressed(_:) IBAction. Все это будет обработано в prepare(for:sender:).

0 голосов
/ 20 февраля 2020

В вызове IBAction выполнить executeSegue

@IBAction func buttonPressed(_ sender: UIButton) {
    performSegue(withIdentifier: "goToActive", sender: nil)  
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if imageDisplayed == UIImage(named: "sad") && segue.identifier == "goToActive"{
        let vc3 = segue.destination as! ThirdViewController
        vc3.buttonTitle.("no", for: .normal)
    }
    else if imageDisplayed == UIImage(named: "happy") && segue.identifier == "goToActive" {
        let vc3 = segue.destination as! ThirdViewController
        vc3.buttonTitle.("happy", for: .normal)
    }
}
...