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

Ale*_*nor 15 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.
Run Code Online (Sandbox Code Playgroud)

viewDidLoad()将导致延迟,并且用户在更改之前会看到旧方法.

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

jav*_*azo 47

即使您确定哪个类表示,也不应该转换父视图控制器.我会用协议做的:

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

protocol ChildNameDelegate {
    func dataChanged(str: String)
}

class ChildClass {

    weak var delegate: ChildNameDelegate?

    func whereTheChangesAreMade(data: String) {
        delegate?.dataChanged(data)
    }
}
Run Code Online (Sandbox Code Playgroud)

而在父母:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 您可以完全符合多个协议(例如,当您符合tableviewdelegate和tableviewdatasource时).您必须使用其他名称命名委托(例如'var secondDelegate:SecondChildNameDelegate?')并在父级中设置两个委托. (2认同)