我在视图控制器方面有一个相当复杂的设置。我有理由这个问题超出了这个问题的范围。所以我有3个视图控制器。
在这种情况下,ViewControllerA是主视图控制器。 ViewControllerB是一个从ViewControllerA显示的容器视图控制器。 ViewControllerB有一个按钮,有一个segue来显示ViewControllerC。然后在ViewControllerC中有一个要关闭的按钮才能返回。
ViewController的A和B可以不同。取决于用户是在编辑对象还是创建新对象。我正在谈论的事情在这两种情况之间保持不变。
基本上我的目标是当用户解除ViewControllerC时,它会更改ViewControllerB上的按钮文本。取决于用户对ViewControllerC的操作。
我正在考虑以某种方式使用self.presentingViewController
,但我无法弄清楚如何在ViewControllerB中访问该特定按钮。
关于如何实现这一目标的任何想法?
答案 0 :(得分:1)
我建议您使用协议来定义更新按钮文本的常用方法。然后,两个ViewControllerB都可以符合此协议。然后使用委托回调方法从ViewControllerC中调用这些方法。
当您从ViewControllerB呈现ViewControllerC时,您可以在呈现之前将delegate
属性设置为self
。您可以在不同的地方执行此操作,具体取决于您呈现ViewControllerC的方式。正如您所说,您正在使用segue来执行此操作,那么您应该使用prepareForSegue
方法执行此操作。
protocol
,定义更新按钮文字的方法,如下所示:protocol ChangeableButtonTextViewController { func updateButtonText(newText: String) }
然后让EditViewControllerB和CreateViewControllerB符合此协议以更新按钮文本:
class EditViewControllerB: UIViewController, ChangeableButtonTextViewController { func updateButtonText(newText: String) { button.text = newText } // Other stuff in your ViewController }
delegate
属性,如下所示:
var delegate: ChangeableButtonTextViewController?
prepareForSegue
方法,如下所示:override func prepare(for segue: UIStoryboardSegue, sender: Any?) { segue.destination as! ViewControllerC).delegate = self }
func dismiss() { delegate.updateButtonText("NewText") }
如果您需要进一步澄清,请与我们联系。