【发布时间】:2011-03-15 12:28:56
【问题描述】:
我有一个加载视图的视图,需要将视图推送到主导航控制器。
我已经为每个视图设置了一个委托,并且基本上将我的调用返回到主导航控制器的“链”。
它有效,但我很好奇是否有更好(更简单?)的方法来实现这一点?
【问题讨论】:
标签: objective-c uiview delegates uinavigationcontroller
我有一个加载视图的视图,需要将视图推送到主导航控制器。
我已经为每个视图设置了一个委托,并且基本上将我的调用返回到主导航控制器的“链”。
它有效,但我很好奇是否有更好(更简单?)的方法来实现这一点?
【问题讨论】:
标签: objective-c uiview delegates uinavigationcontroller
您可以使用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" 是您要响应的通知。
【讨论】:
NSNotificationCenter 不依赖于使用导航控制器。也许您应该创建一个新的 SO 问题,以便我们解决您的问题。
所以视图 A 加载视图 B。稍后,视图 B 加载视图 C 并希望将其视图控制器推送到视图 B 上游的导航控制器上?观点A?视图控制器。
如果视图 B 有一个视图控制器,它是导航堆栈的一部分,那么它的视图控制器可以通过[self navigationController] 抓取导航控制器,无论它在堆栈中有多远。
视图没有指向它们的控制器的指针,但是如果你想完全破坏 MVC,你可以让控制器自己设置一个。更好的方法是让控制器接收点击操作(或任何提示加载和推送视图 C 的操作),然后让视图控制器处理交换。例如,如果视图 B 是一个表视图,您可以将其视图控制器设置为 UITableViewDelegate,以便它可以通过推送新的视图控制器来处理对行的选择。
您的问题似乎表明您没有区分视图、视图控制器、导航控制器和导航控制器内容区域中显示的视图。所有这些对象都扮演着不同的角色,因此在继续开发您的应用程序之前,您最好仔细研究它们以及它们之间的相互关系。
【讨论】:
根据您设置程序的方式,如果您的 App Delegate 包含 UINavigationController,您可以从任何地方访问导航控制器:
[[[NSApp delegate] navigationController] pushViewController: myVC animated:YES];
但同样,这仅在您的应用委托包含 UINavigationController 时才有效。
【讨论】: