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 的大小