如何将值发送到Swift中的父视图控制器

时间:2016-02-16 17:22:11

标签: ios swift

我正在使用swift编写的iOS应用程序的设置视图控制器屏幕。我正在使用导航控制器来运行主设置表视图,该视图显示标题为“输入法”的单元格。"输入法。当前方法列在单元格的右侧。他们可以点击单元格转到下一个视图控制器,在那里他们可以选择他们喜欢的输入法。

从这里开始,有两个部分。第一种是选择的输入法(触摸屏或操纵杆)。第二部分是关于该人是否是左撇子或右撇子的操纵杆。当他们选择一个盒子时,我不想让vc放松,因为他们也可以在另一个盒子中选择一个。

我的问题:如何从子控制器更新父控制器中的文本字段。

我对可选解决方案的问题:

let parentVC: UIViewController = (self.navigationController?.parentViewController)!
parentVC.inputMethod.text? = cellSelected // This doesn't work because it cannot find the label inputMethod.

viewDidLoad()会导致滞后,用户在更改之前会看到旧方法。

当有人点击导航控制器左上角的后退按钮时,我无法找到如何运行segue,因为导航控制器会控制segue。

3 个答案:

答案 0 :(得分:46)

即使您确定哪个类表示,也不要强制转换父视图控制器。我会用协议来做这件事:

在子控制器中添加如下协议:

protocol ChildNameDelegate {
    func dataChanged(str: String)
}

class ChildClass {

    weak var delegate: ChildNameDelegate?

    func whereTheChangesAreMade(data: String) {
        delegate?.dataChanged(data)
    }
}

在父母身上:

class ParentClass: ChildNameDelegate {

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        guard let segueId = segue.identifier else { return }

        switch segueId {
        case "childSegue":
            let destVC = segue.destinationViewController as! ChildClass
            destVC.delegate = self
            break
        default:
            break
        }
    }

    // Child Delegate
    func dataChanged(str: String) {
        // Do whatever you need with the data
    }
}

答案 1 :(得分:2)

您需要将parentViewController转换为它拥有的任何自定义类。例如,如果父级具有类ExampleParentController,则应编写:

let parentVC = (self.navigationController?.parentViewController)! as! ExampleParentController
parentVC.inputMethod.text? = cellSelected

答案 2 :(得分:0)

我在这里找到了一个解决方案:Modifing one variable from another view controller swift http://www.raywenderlich.com/115300/swift-2-tutorial-part-3-tuples-protocols-delegates-and-table-views

您可以使用委托方法调整变量,而不是尝试直接访问视图控制器(如果它没有为视图控制器返回nil会更容易)。 代表的工作就像一个魅力!