Objective c 有更好的办法吗?代表->;代表->;代表

Objective c 有更好的办法吗?代表->;代表->;代表,objective-c,uiview,delegates,uinavigationcontroller,Objective C,Uiview,Delegates,Uinavigationcontroller,我有一个加载视图的视图,需要将视图推送到主导航控制器 我已经为每个视图设置了一个代理,并且基本上通过“链”向上调用主导航控制器 它可以工作,但我很好奇是否有更好(更简单?)的方法来实现这一点?根据您设置程序的方式,如果您的应用程序代理包含UINavigationController,您可以从任何地方访问导航控制器: [[[NSApp delegate] navigationController] pushViewController: myVC animated:YES]; 但同样,只有当您的

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

我已经为每个视图设置了一个代理,并且基本上通过“链”向上调用主导航控制器


它可以工作,但我很好奇是否有更好(更简单?)的方法来实现这一点?

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

[[[NSApp delegate] navigationController] pushViewController: myVC animated:YES];
但同样,只有当您的应用程序代理包含
UINavigationController

时,才能使用发送导航控制器将响应的消息

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

[[NSNotificationCenter defaultCenter] postNotificationName:@"DoWork" object:nil];
其中,
@“DoWork”
是另一个对象将响应的唯一(最有可能)消息名

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

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

其中,
@selector(doWork)
是发布通知时要执行的选择器,
@“doWork”
是要响应的通知。

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

如果视图B具有作为导航堆栈一部分的视图控制器,则其视图控制器可以通过
[self-navigationController]
抓住导航控制器,而不管它在堆栈下多远

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


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

UGH。所以我修正了打字错误。我经常在Mac OS和iOS之间进行编程。如果你没有NavigationController,有没有同样的方法?我试图将NotificationnCenter添加到我的第一个VC中,然后从另一个VC调用DoWork,但它会使应用程序崩溃(无法识别的选择器发送到…)。所以我猜您在这里描述的内容取决于使用导航控制器?@n.evermind:
NSNotificationCenter
不依赖于使用导航控制器。也许您应该创建一个新的SO问题,以便我们能够解决您的问题。