2011-03-15 169 views
7

我有一个视图加载一个视图,需要将视图推送到主导航控制器。有没有更好的方法?委托 - >委托 - >委托

我已经为每个视图设置了一个委托,并且基本上使我的调用备份到主导航控制器的'链'。

它的作品,但我很好奇,如果有更好的(更容易?)的方式来实现这一目标?

回答

-1

取决于你如何设置你的程序中,如果您的应用程序代理包含UINavigationController你可以从任何地方访问导航控制器:

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

但同样,只有工作,如果您的应用程序委托包含UINavigationController

+0

UGH。所以我解决了错别字。我经常在Mac OS和iOS编程之间进行切换。 – 2011-03-15 12:56:59

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"是您想要回复的通知。

+0

如果你没有NavigationController,有没有办法做到这一点?我试图添加NotificiationnCenter到我的第一个VC,然后从另一个VC调用DoWork,但它会崩溃应用程序(无法识别的选择器发送到...)。所以我想你在这里描述取决于使用NavigationController? – 2011-10-09 12:16:35

+0

@ n.evermind:'NSNotificationCenter'不依赖于使用导航控制器。也许你应该创建一个新的SO问题,以便我们解决你的问题。 – FreeAsInBeer 2011-10-09 16:12:18

2

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

提供的视图B具有作为导航堆栈一部分的视图控制器,则其视图控制器可以通过[self navigationController]抓取导航控制器,无论堆栈有多远。

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

你的问题似乎表明你没有区分视图,视图控制器,导航控制器和显示在导航控制器内容区域中的视图。所有这些对象都扮演不同的角色,因此在继续开发您的应用程序之前,您可以更仔细地查看它们及其相互关系。