在Swift中将变量传递回父级

时间:2015-02-12 11:14:45

标签: ios xcode swift

我正在重新编写一个将代码从Objective-C转换为swift的教程。该应用程序从VC移动,其中有3个滑块(红色,绿色和蓝色)设置背景颜色,颜色名称的标签和链接到第二个VC的按钮。在第二个VC中,来自第一个VC的颜色用作背景,用户有机会命名颜色。

当用户输入颜色名称时,它应该将新颜色名称返回到原始VC,显示颜色名称的标签应显示输入的文本。

以下是导致问题的代码:

func textFieldShouldReturn(nameEntry: UITextField) -> Bool
{
    ViewController().colourLabel.text = nameEntry.text
    nameEntry.resignFirstResponder()
    dismissViewControllerAnimated(true, completion: nil)
    return true
}

生成错误“致命错误:在解包可选值时意外发现nil”。但是,调试nameEntry.text中有一个字符串。

我有点难过。我可以尝试为unwind segue做准备,但它应该是一个教程应用程序。

干杯

2 个答案:

答案 0 :(得分:15)

ViewController()实际上会为您创建ViewController的新实例。这不是对现有ViewController的引用。你可以做的是创建一个弱变量,指向第二个ViewController中的第一个ViewController,并将其设置为prepareForSegue或显示第二个View控制器。

class SecondViewController : UIViewController {
    weak var firstViewController : ViewController?

    // Other code

    func textFieldShouldReturn(nameEntry: UITextField) -> Bool
    {
        firstViewController?.colourLabel.text = nameEntry.text
        nameEntry.resignFirstResponder()
        dismissViewControllerAnimated(true, completion: nil)
        return true
    }
}

内部第一视图控制器prepareForSegue

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "SecondViewController" {

        let secondViewController = segue.destinationViewController as SecondViewController
        secondViewController.firstViewController = self
    }
}

答案 1 :(得分:0)

ViewController()返回的视图控制器可能尚未加载其视图。你可以尝试在setter函数中检查它并存储它以便以后加载视图时使用。

class VC : UIViewController {
    @IBOutlet weak var colourLabel: UILabel!
    var savedLabelText: String?

    override func viewDidLoad() {
        super.viewDidLoad()

        self.colourLabel.text = self.savedLabelText
    }

    func setColorLabelText(label: String) {
        if self.isViewLoaded() {
            self.colourLabel.text = label
        }
        else {
            self.savedLabelText = label
        }
    }
}