有没有更好的办法?代表 - >代表 - >代表

时间:2011-03-15 12:28:57

标签: objective-c uiview delegates uinavigationcontroller

我有一个加载视图的视图,需要将视图推送到主导航控制器。

我为每个视图设置了一个委托,并且基本上将我的呼叫备份到主导航控制器的“链”。

它有效,但我很好奇是否有更好(更容易?)的方法来实现这一目标?

3 个答案:

答案 0 :(得分:7)

您可以使用NSNotificationCenter发送您的NavigationController将响应的消息。

在您需要调用NavigationController的视图中,您可以编写如下内容:

[[NSNotificationCenter defaultCenter] postNotificationName:@"DoWork" object:nil];

其中@"DoWork"是另一个对象将响应的唯一(最可能)消息名称。

在您的NavigationController中,您需要添加一个观察者才能捕获该通知,如下所示:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(doWork) name:@"DoWork" object:nil];

@selector(doWork)是发布通知时要执行的选择器,@"DoWork"是您要回复的通知。

答案 1 :(得分:2)

因此,视图A加载视图B.稍后,视图B加载视图C并希望将其视图控制器推送到视图B上游的导航控制器上?查看A的?查看控制器。

如果视图B有一个视图控制器,它是导航堆栈的一部分,那么它的视图控制器可以通过[self navigationController]抓住导航控制器,无论它在堆栈的多远处。

视图没有指向其控制器的指针,但是如果你想完全打破MVC,你可以让控制器自己设置一个。更好的方法是让控制器接收tap操作(或者提示加载和推送视图C的任何操作),然后让视图控制器处理交换。例如,如果视图B是表视图,则将其视图控制器设置为UITableViewDelegate,以便它可以通过推送新的视图控制器来处理行的选择。

您的问题似乎表明您没有区分视图,视图控制器,导航控制器以及导航控制器内容区域中显示的视图。所有这些对象都起着不同的作用,因此在继续开发应用程序之前,您可以更好地了解它们及其相互关系。

答案 2 :(得分:-1)

根据您设置程序的方式,如果您的App Delegate包含UINavigationController,您可以从任何地方访问导航控制器:

[[[NSApp delegate] navigationController] pushViewController: myVC animated:YES];

但同样,只有在您的应用委托包含UINavigationController时才有效。

相关问题