gpt4 book ai didi

iphone - 委托(delegate)VS。 iPhoneOS 中的通知

转载 作者:行者123 更新时间:2023-12-03 18:14:50 25 4
gpt4 key购买 nike

我试图从 subview Controller 调用 Root View Controller 中的方法,这样当我更改选项时,它们将自动更新 Root View ,这又会更新其他几个 View Controller 。对于第二部分,我使用了通知,但对于第一部分,我尝试使用委托(delegate),因为它(所以我被引导相信)是一种很好的编程实践。我在使其工作时遇到困难,并且知道我可以轻松设置另一个通知来完成这项工作。我应该继续尝试实现委托(delegate)还是仅使用通知?

最佳答案

在许多情况下,委派是一种很好的编程实践,但这并不意味着如果您不习惯它就必须使用它。委托(delegate)和通知都有助于将 View Controller 彼此解耦,这是一件好事。通知可能更容易编码,并且具有多个对象可以观察一个通知的优点。对于委托(delegate),如果不修改委托(delegate)对象就无法完成这样的事情(并且很不寻常)。

委托(delegate)的一些优点:

  • 委托(delegate)对象和委托(delegate)之间的联系变得更加清晰,特别是在必须实现委托(delegate)的情况下。
  • 如果必须将多种类型的消息从委托(delegate)者传递到委托(delegate)者,则委托(delegate)可以通过为每条消息指定一个委托(delegate)方法来使这一点更加清晰。 对于通知,您可以使用多个通知名称,但所有通知最终都会在观察者一侧以相同的方法结束(可能需要令人讨厌的 switch 语句)。

只有您可以决定哪种模式更适合您。在任何情况下,您都应该考虑不要让 View Controller 发送通知或委托(delegate)消息。在许多情况下, View Controller 应该更改模型,然后模型应该通知其观察者或其委托(delegate)它已更改。

实现委托(delegate)模式很简单:

  1. 在 ChildViewController.h 中,声明委托(delegate)稍后必须实现的委托(delegate)协议(protocol):

    @protocol ChildViewControllerDelegate <NSObject>
    @optional
    - (void)viewControllerDidChange:(ChildViewController *)controller;
    @end
  2. 在文件顶部,创建一个实例变量来保存指向 ChildViewController 中委托(delegate)的指针:

    @protocol ChildViewControllerDelegate;
    @interface ChildViewController : UIViewController {
    id <ChildViewControllerDelegate> delegate;
    ...
    }
    @property (assign) id <ChildViewControllerDelegate> delegate;
    ...
    @end
  3. 在 RootViewController.h 中,使您的类符合委托(delegate)协议(protocol):

    @interface RootViewController : UIViewController <ChildViewControllerDelegate> {
    ...
  4. 在 RootViewController 实现中,实现委托(delegate)方法。另外,当您创建 ChildViewController 实例时,您必须分配委托(delegate)。

    @implement RootViewController
    ...
    // in some method:
    ChildViewController *controller = [[ChildViewController alloc] initWithNibName:...
    controller.delegate = self;
    ...
    - (void)viewControllerDidChange:(ChildViewController *)controller {
    NSLog(@"Delegate method was called.");
    }
    ...
  5. 在ChildViewController实现中,在适当的时候调用委托(delegate)方法:

    @implementation ChildViewController
    ...
    // in some method:
    if ([self.delegate respondsToSelector:@selector(viewControllerDidChange:)]) {
    [self.delegate viewControllerDidChange:self];
    }
    ...

就是这样。 (注:我是凭内存写的,因此其中可能存在一些拼写错误/错误。)

关于iphone - 委托(delegate)VS。 iPhoneOS 中的通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2232694/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com