如何在 xcode 中从控制器外部更新视图
Posted
技术标签:
【中文标题】如何在 xcode 中从控制器外部更新视图【英文标题】:How to update a view from outside a controller in xcode 【发布时间】:2012-06-17 16:53:43 【问题描述】:到目前为止,我只从其控制器中更新了一个视图。我现在处于一种不同的情况,我需要根据我的应用程序的另一个类 C 中发生的某些事件来更新视图(文本标签)中的元素。我意识到这是基本的,但我不清楚处理这个问题的正确方法是什么。
我应该在 C 的 init 方法中传递我的视图控制器吗? (每当我初始化 C 类时,传入视图控制器似乎很麻烦。也需要大量重构。)
我是否应该通过调用 [[UIApplication sharedApplication] delegate] 从 C 中检索应用程序委托,并从应用程序委托中检索我需要的视图控制器?
这两种方法都没有让我觉得实用或优雅。
有没有更好的办法?
【问题讨论】:
【参考方案1】:两种最常用的方法是委托和通知。
在一种情况下,您给 C 类一个委托属性并将其设置为视图控制器。为了让它看起来不错,您可以定义一个类似于对许多 API 类所做的委托协议。 可以在 init 中传递,但标准的做法是直接设置属性。
另一种方法是让视图控制器在事件发生时侦听 C 类发送的通知。然后,视图控制器在收到通知时进行更新。
【讨论】:
谢谢。在我的情况下,它看起来确实像一个协议可能是要走的路。我会尝试一下。我不完全确定您所说的第二种解决方案是什么意思。如果类 C 能够发送通知,则意味着它可以访问视图控制器的实例,在这种情况下,调用该视图控制器中的方法以相应地更新视图同样容易,不是吗? 不,发送通知的对象将其发送到通知中心,并不关心谁在监听它。通知中心只是将它传递给已注册侦听它的任何对象。它甚至比委托更松散。 如果通知是如此灵活,那么您建议的两种方法似乎都非常适合我的情况。在使用委托协议和使用建议一种方法更适合我的情况的通知之间是否存在权衡? 在某些时候,个人品味和哲学会进入其中。委托的意义(几乎是定义)是一个对象,它承担了最合理的某个其他对象的责任。但是,当您谈论对事件做出反应时,这是通知的主要领域。尽管有这些要点,但仍有很多代码使用委托来传递一个值。我可能会使用通知,但我也可能是少数。真的很有帮助,不是吗? :)以上是关于如何在 xcode 中从控制器外部更新视图的主要内容,如果未能解决你的问题,请参考以下文章
以编程方式设置 rootViewController 不起作用,仅在 Xcode 11 中从情节提要中选择初始视图控制器