【问题标题】:Is there a better way? Delegate -> Delegate -> Delegate有没有更好的办法?委托 -> 委托 -> 委托
【发布时间】:2011-03-15 12:28:56
【问题描述】:

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

我已经为每个视图设置了一个委托,并且基本上将我的调用返回到主导航控制器的“链”。

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

【问题讨论】:

    标签: objective-c uiview delegates uinavigationcontroller


    【解决方案1】:

    您可以使用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" 是您要响应的通知。

    【讨论】:

    • 如果你没有 NavigationController 有没有办法做同样的事情?我尝试将 NotificiationnCenter 添加到我的第一个 VC,然后从另一个 VC 调用 DoWork,但它会使应用程序崩溃(无法识别的选择器发送到 ...)。所以我猜你在这里描述的内容取决于使用 NavigationController?
    • @n.evermind: NSNotificationCenter 不依赖于使用导航控制器。也许您应该创建一个新的 SO 问题,以便我们解决您的问题。
    【解决方案2】:

    所以视图 A 加载视图 B。稍后,视图 B 加载视图 C 并希望将其视图控制器推送到视图 B 上游的导航控制器上?观点A?视图控制器。

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 呃。所以我修正了错别字。我经常在 Mac OS 和 iOS 编程之间穿梭。
      猜你喜欢
      • 1970-01-01
      • 2011-01-12
      • 1970-01-01
      • 1970-01-01
      • 2013-01-17
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      相关资源
      最近更新 更多