我有一个加载视图的视图,需要将视图推送到主导航控制器。
我为每个视图设置了一个委托,并且基本上将我的呼叫备份到主导航控制器的“链”。
它有效,但我很好奇是否有更好(更容易?)的方法来实现这一目标?
答案 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
时才有效。