Swift:无法使用发送方通过序列设置{String]

时间:2018-07-16 11:58:45

标签: ios arrays swift segue

美好的一天。我正在创建自己的第一个应用程序,但遇到了问题。我有一个带有可点击内容的AR场景,当您触摸它们时,segue会触发到ViewController中,并根据屏幕上的触摸内容来设置视图控制器标签和textview。

说明:1. CaseViewController是目标视图控制器。 2.“ artNews”和“ politicalNews”是字符串数组,其中我编写了3个字符串,它们是定义的,永远不会为零。

问题:由于segueInputText为零,我崩溃了。为什么会变成零,我该如何纠正?

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

    let destinationVC = segue.destination as! CaseViewController
    destinationVC.segueInputText = sender as? [String]

    print("\(String(describing: sender))")
}

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {

    guard let touchLocation = touches.first?.location(in: sceneView),
        let hitNode = sceneView?.hitTest(touchLocation, options: nil).first?.node,
        let nodeName = hitNode.name
        else { return }

    if nodeName == imageNameArray[0] {

        performSegue(withIdentifier: "CaseViewController", sender: artNews)

    } else {
        print("Found no node connected to \(nodeName)")
        return
    }

    if nodeName == imageNameArray[1] {

        performSegue(withIdentifier: "CaseViewController", sender: politicalNews)

    } else {
        print("Found no node connected to \(nodeName)")
        return
    }

CaseViewController具有连接的UILabel和UITextViews,并且:

    var segueInputText : [String]? {
    didSet {
        setupText()
    }
}

    func setupText() {

    // Why are these values nil? 
    testLabel.text = segueInputText![0]
    ingressLabel.text = segueInputText![1]
    breadLabel.text = segueInputText![2]

    testLabel.reloadInputViews()
    ingressLabel.reloadInputViews()
    breadLabel.reloadInputViews() //breadLabel is a UITextView
}

感谢您阅读我的问题! 此致。

3 个答案:

答案 0 :(得分:3)

删除didSet块,就像将数组设置为prepare一样,观察触发器,并且lbl仍为nil

OR

func setupText() {
   if testLabel == nil { // if one is nil then all of them too
     return 
   }
 }

答案 1 :(得分:2)

在这种情况下,请勿使用didSet观察者。它永远都行不通。

setupText()中访问IBOutletsprepare(for尚未被连接。


删除观察者

var segueInputText : [String]?

并在setupText中呼叫viewWillAppear

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    setupText()
}

答案 2 :(得分:1)

在您执行此操作的那一刻:

destinationVC.segueInputText = sender as? [String]

目标视图控制器尚未加载,因此没有连接任何插座,因此访问它们中的任何一个都将使您的应用程序崩溃,因为它们仍然为零。

您将必须将要传递给目标控制器的任何值分配给某个属性,并将该属性的值分配给viewDidLoad中相应的出口。这样,您可以确保所有插座均已连接。

出于相同的原因,请不要使用属性观察器将属性的值分配给任何标签,因为在视图控制器有机会加载之前,这种情况还是会发生……