【问题标题】:How can I use didSet to change the text of a UITextField (IBOutlet)?如何使用 didSet 更改 UITextField (IBOutlet) 的文本?
【发布时间】:2014-11-03 20:02:12
【问题描述】:

我想在我传递的模型对象的 DidSet 中设置 UITextField (IBOutlet) 的文本值。

代码如下:

    let manageSettingViewController: ManageSettingViewController = self.storyboard?.instantiateViewControllerWithIdentifier("ManageSettingViewController") as ManageSettingViewController
    self.navigationController?.pushViewControllerCustom(manageSettingViewController)
    manageSettingViewController.setting = setting

而在manageSettingViewController的didSet中:

   var setting: Setting? {
    didSet
    {
        keyTextField.text = setting?.label
        valueTextField.text = setting?.value
    }

如何设置文本?因为在这种情况下 Xcode 崩溃是因为 "keyTextField is nil" :(

【问题讨论】:

    标签: swift storyboard interface-builder


    【解决方案1】:

    您在实例化manageSettingViewController 之后立即设置manageSettingViewController.setting——此时,它还没有从笔尖/故事板加载它的视图,所以它的所有IBOutlet 变量(大概是keyTextField和valueTextField 仍然是零。在调用 ManageSettingViewController 的 viewDidLoad 方法时,这些文本字段已关联。

    您可以更改didSet 以在设置可选插座之前检查它们,或通过可选链接进行分配:

    didSet {
        keyTextField?.text = setting?.label
        valueTextField?.text = setting?.value
    }
    

    这样可以避免崩溃,但也无法更改文本字段的内容。您还必须为ManageSettingViewController 实现viewDidLoad 以检查其setting 属性并相应地设置其文本字段。

    当然,这会复制您的didSet 中的代码。如果您想从其他地方设置 setting 并自动更新 UI,该代码可能仍然有用,但 didSet 不会帮助您在 UI 加载之前更新 UI。

    【讨论】:

    • 对于objective c,我经常使用这种模式。为了避免重复代码,我在 viewDidLoad 中添加了 self.setting = self.setting 以再次触发 setter。但是,这不再是 swift 的可能了。有什么解决方法的想法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-07
    • 2017-10-15
    • 1970-01-01
    相关资源
    最近更新 更多