请注意,一个视图是从一个viewController外部加载

问题描述:

任何帮助,将不胜感激。请注意,一个视图是从一个viewController外部加载

我正在寻找一种方法,以编程方式通知从该viewController的外部加载视图。

比方说,我的主视图有5个按钮,在视图加载后,按钮出现后,我想在另一个文件(在该viewContrller外)通知它已加载。如何/在哪里可以检查并得到通知?

我需要做一些面向方面的编程吗?

+0

这是可能不添加/更改该视图控制器的源代码中的任何东西。我想跟踪的所有代码更改都应该在控制文件中的viewController之外进行编码。 – ramo 2012-04-04 20:52:01

+0

您可以使控制对象成为另一个对象内部属性更改的观察者。我已经更新了我的解释答案。 – 2012-04-04 21:19:07

使用NSNotificationCenter。你可以在类之间进行通信。

在您的其他对象中侦听自定义NSNotification。让视图控制器在其生命周期的任何部分最有意义的时候发布该通知(viewDidLoad,viewDidAppear ...)。

如果您不能发布通知,那么观察keyPath可能是一条路。例如,你可以把这样的事情在你的控制目标,然后实现observeValueForKeyPath:

[viewController addObserver:self 
       forKeyPath:@"view" 
        options:NSKeyValueObservingOptionNew 
        context:NULL]; 

NSNotificationCenter或委托方法是完成这一任务的最合适的方式。

虽然您可以使用其他人建议的通知或KVO来做到这一点,但这强烈地暗示了设计问题。你不应该直接访问视图控制器的内部视图。所以更深层次的问题是:你为什么想知道?

根据我的经验,最可能的原因是您让其他对象设置标题或修改已启用。这打破了MVC,并导致你可能试图解决的问题。处理这个问题的正确方法是将数据放入各个视图控制器之间共享的模型对象中。当前视图控制器可以观察模型上的更改并适当地更新其UI元素。

+0

我正在寻找一种通过编程方式通知从该视图外部加载视图的方式。 我明白,为了在类之间进行通信,我可以使用NSNotificationCenter,或使用委托方法或标记视图等。但我不想在视图控制器的源代码中更改任何内容。我想让外界知道像图书馆或框架管理这件事。到目前为止,我所有的搜索都没有那么有用,看起来像Objective-C中有一些面向方面的编程,我可能需要看看。 – ramo 2012-04-04 21:34:00

+0

你能解释为什么你想访问视图控制器的私人信息(它的视图,它是唯一负责管理的)?打破MVC会倾向于咬你可可。您在此使用的工具是KVO(关键值观察),但它强烈地表明设计问题。 – 2012-04-04 21:46:53