我正在使用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。
答案 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会更容易)。 代表的工作就像一个魅力!