在Swift中将variables传递给父项
我正在重写一个将Objective-C的代码转换成swift的教程。 该应用程序从VC一个有3个滑块(红色,绿色和蓝色),设置背景颜色,颜色名称的标签和链接到第二个VC的button。 在第二个VC中,来自第一个VC的颜色被用作背景,并且用户有机会命名该颜色。
当用户input颜色名称时,应该将新颜色名称返回到原始VC,并且显示颜色名称的标签应该显示input的文本。
以下是导致问题的代码:
func textFieldShouldReturn(nameEntry: UITextField) -> Bool { ViewController().colourLabel.text = nameEntry.text nameEntry.resignFirstResponder() dismissViewControllerAnimated(true, completion: nil) return true }
生成错误“ 致命错误 :意外地发现零,而解包可选值”。 但是,debuggingnameEntry.text中有一个string。
我有点难住。 我可以尝试做一个准备放松segue,但它是一个教程的应用程序。
干杯
ViewController()
实际上创build了一个ViewController
的新实例。 这不是对已经存在的ViewController
的引用。 你可以做的是创build一个弱variables,指向第二个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 } }
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 } } }