将Label的文本属性从FirstVC传递给SecondVC返回nil

时间:2019-02-26 17:13:47

标签: swift label

面对一个nil异常,同时在FirstVC上传递标签文本的属性并将其反映到Label上的SecondVC。

线程1:致命错误:在展开可选值时意外发现nil

https://github.com/marlhex/PasingDataAroundVC

Debugger Desc.

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

        if segue.identifier == "toSecondSegue" {

            // Instance to the next screen
            let svc = segue.destination as! SecondVC

            // Assigning the same value to the next screen
            svc.sameName!.text = self.originalName.text
        }
    }

有人知道如何相应地传递数据吗?

我知道标签text的属性的默认值将为nil,但是我只是被这个停住了,我知道,令人难以置信

4 个答案:

答案 0 :(得分:1)

为什么不使用委托?

protocol firstVCDelegate {
    func passingName(_ text: String)
}

class FirstVC: UIViewController {
    public weak var delegate: firstVCDelegate?

    func goToSecondVC() {
       self.delegate?.passingName(futureName.text)
    }

}

class SecondVC: UIViewController, firstVCDelegate {

    func passingName(_ text: String) {
      sameName.text = text
    }
}

答案 1 :(得分:1)

在vc加载之前,标签一直为nil,所以

svc.sameName!.text = self.originalName.text

所以使用!会使应用程序崩溃,您需要在目标类中声明一个字符串,例如

@IBOutlet weak var sameName: UILabel!

var str = ""

override func viewDidLoad() {
    super.viewDidLoad()
    sameName.text = str   // assign here
}

然后将其分配给发件人vc prepare

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

        if segue.identifier == "toSecondSegue" {

            // Instance to the next screen
            let svc = segue.destination as! SecondVC

            // Assigning the same value to the next screen 
            svc.str = self.originalName.text
        }
    }

答案 2 :(得分:1)

您正在尝试直接将文本传递给尝试分配该值时未加载到视图中的UILabel

您需要将originalName.text传递到SecondVC中的String variable,然后将该值分配给UILabel中的viewDidLoad

SecondVC

var name: String!

@IBOutlet weak var sameName: UILabel!

override func viewDidLoad() {
    super.viewDidLoad()
    sameName.text = name
}

FirstVC

svc.name = self.originalName.text

答案 3 :(得分:1)

您不能直接从FirstViewController访问子控制器实例。您可以按照以下方式使用String变量来完成此操作。

  

在SecondViewContorller中声明临时字符串变量,并将其设置为   将值添加到viewDidLoad中的标签控制器,如下所示。

/// Temp string value to set over the controller
var tempValue: String = ""


override func viewDidLoad() {
    super.viewDidLoad()

    self.sameName.text = self.tempValue
}

希望这可以解决您的问题。