iOS更改按钮文本呈现视图控制器

时间:2017-06-19 18:59:44

标签: ios swift uiviewcontroller

我在视图控制器方面有一个相当复杂的设置。我有理由这个问题超出了这个问题的范围。所以我有3个视图控制器。

在这种情况下,ViewControllerA是主视图控制器。 ViewControllerB是一个从ViewControllerA显示的容器视图控制器。 ViewControllerB有一个按钮,有一个segue来显示ViewControllerC。然后在ViewControllerC中有一个要关闭的按钮才能返回。

ViewController的A和B可以不同。取决于用户是在编辑对象还是创建新对象。我正在谈论的事情在这两种情况之间保持不变。

基本上我的目标是当用户解除ViewControllerC时,它会更改ViewControllerB上的按钮文本。取决于用户对ViewControllerC的操作。

我正在考虑以某种方式使用self.presentingViewController,但我无法弄清楚如何在ViewControllerB中访问该特定按钮。

关于如何实现这一目标的任何想法?

1 个答案:

答案 0 :(得分:1)

我建议您使用协议来定义更新按钮文本的常用方法。然后,两个ViewControllerB都可以符合此协议。然后使用委托回调方法从ViewControllerC中调用这些方法。

当您从ViewControllerB呈现ViewControllerC时,您可以在呈现之前将delegate属性设置为self。您可以在不同的地方执行此操作,具体取决于您呈现ViewControllerC的方式。正如您所说,您正在使用segue来执行此操作,那么您应该使用prepareForSegue方法执行此操作。

  1. 声明protocol,定义更新按钮文字的方法,如下所示:
  2. protocol ChangeableButtonTextViewController {
        func updateButtonText(newText: String)
    }
    

    然后让EditViewControllerB和CreateViewControllerB符合此协议以更新按钮文本:

    class EditViewControllerB: UIViewController, ChangeableButtonTextViewController {
        func updateButtonText(newText: String) {
            button.text = newText
        }
    
        // Other stuff in your ViewController
    }
    
    1. 向ViewControllerC添加delegate属性,如下所示:
    2.   

      var delegate: ChangeableButtonTextViewController?

      1. 向EditViewControllerB和CreateViewControllerB添加prepareForSegue方法,如下所示:
      2. override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
              segue.destination as! ViewControllerC).delegate = self
        }
        
        1. 然后你可以在ViewControllerC中执行类似的操作:
        2. func dismiss() {
              delegate.updateButtonText("NewText")
          }
          

          如果您需要进一步澄清,请与我们联系。