Я продолжаю получать эту ошибку, поскольку я пытаюсь изменить текст метки из другого представления - PullRequest
0 голосов
/ 21 февраля 2019

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

вот мой первый контроллер вида

import UIKit

protocol gameModeDelegate {
    func didTapChoice(test:String)

}

class ViewController2: UIViewController {
    var selectionDelegate:gameModeDelegate!

    @IBAction func chooseButton(_ sender: Any) {

        selectionDelegate.didTapChoice(test: "TEST")

        let selectVC = storyboard?.instantiateViewController(withIdentifier: "VC1") as! ViewController

        present(selectVC,animated: true,completion: nil)            

    }
    override func viewDidLoad() {
        super.viewDidLoad() 
    }
}

вот что у меня естьсделано во втором, где метка

override func viewDidLoad() {
        super.viewDidLoad()
            let selectVC2 = storyboard?.instantiateViewController(withIdentifier: "VC1") as! ViewController2
            selectVC2.selectionDelegate = self

            winningLabel.isHidden = true
            winningLabel.center = CGPoint(x: winningLabel.center.x, y: winningLabel.center.y - 400)
      playAgainoutlet.isHidden = true
            playAgainoutlet.center = CGPoint(x: playAgainoutlet.center.x, y: playAgainoutlet.center.y + 400)
    }
extension ViewController: gameModeDelegate{
        func didTapChoice(test: String) {
            CommunicationLabel.text = test
        }



    }

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

Поток 1: Неустранимая ошибка: неожиданно обнаружил ноль при развертывании Необязательныйзначение

1 Ответ

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

Вы не должны использовать этот подход для достижения результата, вы можете использовать два разных подхода для достижения одного и того же результата.

1- Используйте подход протокола делегата: в secondViewController вы должныобъявите протокол как этот

protocol applySelecction {
    func applyText(text: String)
}

и в классе объявите переменную как этот.

var delegate: apply selection?

затем в действии кнопки

@IBAction func saveButtom(sender: UIButton){
    //print(selected)
    delegate?.applySelection(text: text) //text is the value select from UILAbel o the option the user select
    self.dismiss(animated: true, completion: nil)
}

затем в firstViewController соответствует протоколу applySelection следующим образом:

class FirstViewController: UIViewController,applySelection{
func applyText(text: String){
   //update the UIlabel here 

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

 var applyText: ((String) -> Void)?

, затем в

@IBAction func saveButtom(sender: UIButton){
    self.applyText(text) //text is your text to update
}

и в firstViewController для подготовки кsegue rewrite следующим образом.

let vc = segue.destination as! fisrtViewController)
            vc.applyText = { [weak self] data in
                guard let self = self else {return}
                self.text = text //this is assigning the text to self-text supposing text is a UILabel in this viewController                    
            }

Вы можете попробовать один из двух подходов, которые могут показаться вам подходящими.

РЕДАКТИРОВАТЬ .

попробуйте это.

 class ViewController2: UIViewController {
        var selectionDelegate:gameModeDelegate!

    @IBAction func chooseButton(_ sender: Any) {

        selectionDelegate.didTapChoice(test: "TEST")
        //if segue is a show segue
        self.navigationController?.popViewController(animated: true)
       //else is a modal segue.
        dismiss(animated: true, completion: nil)
    }
    override func viewDidLoad() {
        super.viewDidLoad() 
    }
}

PD.Вам не нужно представлять viewcontroller, уже присутствующий в стеке представлений, только отклонить его.Удачи

...