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

Posted

技术标签:

【中文标题】iOS 在呈现视图控制器时更改按钮文本【英文标题】:iOS Change Button Text on Presenting View Controller 【发布时间】:2017-06-19 18:59:43 【问题描述】:

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

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

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

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

我正在考虑以某种方式或类似的方式使用self.presentingViewController,但我不知道如何访问 ViewControllerB 中的特定按钮。

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

【问题讨论】:

使用委托给 viewcontroller b 一个回调并在那边更新你的按钮。 @PrakashShaiva 你有机会提供一些示例代码吗?不太确定我将如何实现这一点。 你是如何从 C 移回 B 的?您是在展开 segue 还是只是关闭正在展示的视图控制器? @DavidShaw 检查是否self.navigationController != nil 如果是self.navigationController?.popViewController 否则dismiss。目前仅在 iPad 上使用导航控制器来实现弹出功能。 参考此链接了解如何实现委托theappguruz.com/blog/ios-delegates 【参考方案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

    像这样向 ViewControllerC 添加 delegate 属性:

var delegate: ChangeableButtonTextViewController?

    向 EditViewControllerB 和 CreateViewControllerB 添加一个prepareForSegue 方法,如下所示:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
      segue.destination as! ViewControllerC).delegate = self

    然后您可以在 ViewControllerC 中执行以下操作:
func dismiss() 
    delegate.updateButtonText("NewText")

如果您需要任何进一步的说明,请告诉我。

【讨论】:

如何定义delegate 所以delegate 可以这样定义:weak var delegate: ViewControllerB? 好吧,有一个问题。 ViewControllerB 有两个不同的选项。就像它可能是 EditViewControllerB 或 CreateViewControllerB。 ViewControllerC 对于这两者来说都是一样的。 太棒了!非常感谢。现在测试它。到目前为止有一个错误,'weak' may only be applied to class and class-bound protocol types, not 'ChangeableButtonTextViewController'。删除 weak 修复了这个问题。 这似乎很好用!!最终将delegate.updateButtonText("NewText") 更改为delegate?.updateButtonText(newText: "NewText") 只是因为它的设置方式。今天完全学到了一些新东西。非常感谢您提供的详细信息和示例代码。我在一段时间内看到的更好的 Stack Overflow 答案之一。现在将投票并接受。非常感谢。

以上是关于iOS 在呈现视图控制器时更改按钮文本的主要内容,如果未能解决你的问题,请参考以下文章

iOS 8 自定义视图控制器演示:在动画期间更改呈现的 VC 的大小

从 iOS 中呈现的视图控制器推送视图

当被模态视图控制器覆盖时,iOS 6 视图控制器布局在方向更改后不会更新

iOS - 每次显示的视图更改时回调

iOS - 在其顶部呈现模式后保留视图控制器状态

UIAlertController 错误当在 swift 中以模态呈现的视图控制器中调用时