【问题标题】:Is it necessary that a delegate message should always have void as a return type?委托消息是否必须始终将 void 作为返回类型?
【发布时间】:2013-03-19 11:42:41
【问题描述】:

我有一个场景,即 Obj A 在按下按钮时向 Obj B 发送委托消息。 Obj B 根据委托调用采取一些行动。

Obj A 希望根据调用该委托消息后发生的结果在屏幕上显示某些内容。

Say Obj B 维护一个计数器,记录该操作发生了多少次。

所以当 Obj A 按下按钮并调用委托方法时,该委托方法返回一个值是否是个好主意,在我的例子中是当前计数器?

以便 Obj A 可以显示计数器更新值。

在这种情况下,同一条消息同时充当代表和数据源。

对我来说,Obj A 是 View 而 Obj B 是 View Controller。

我的实现有缺陷吗?

【问题讨论】:

  • 代表绝对没有什么特别之处。它只是一个包含您要访问的某些功能的类/实例/方法。例如,您可以将框的文件系统视为一组委托——您调用它们,它们执行服务。

标签: ios objective-c design-patterns


【解决方案1】:

我喜欢你的实现。

即使它不区分委托和数据源角色,它也会以更简单的方式组合它们。

我猜想实现 MVC 概念的适当方法是:

  • A(视图)向 B(代理)发送一条消息,说“我被窃听了”或类似的东西。

  • B(委托人)根据需要向 A 发送一条消息“reloadData”。

  • A 要求 B(现在作为数据源)显示数据。

因为在您的情况下,委托和数据源是同一个对象,就像在许多其他情况下发生的那样,在我看来,像您那样实现流程是非常合理的,并且完全没有缺陷:

  • A(视图)向 B(委托和数据源)发送消息并接收刷新视图所需的数据信息。

【讨论】:

    【解决方案2】:

    不,在许多情况下它不返回 void 而是一个值。

    这是一种有效且常用的方法.. 一个例子是 UITextView 的委托:

    - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text;

    但许多其他组件都这样做,因此它们不必过于专业,但 因此它们可以保持通用

    【讨论】:

      【解决方案3】:

      不,这不是一个规则,委托应该返回 void。

      有很多 delegates 返回非空值。

      - (BOOL)application:(NSApplication *)sender
          openFile:(NSString *)filename;                        // NSApplication
      - (BOOL)application:(UIApplication *)application
          handleOpenURL:(NSURL *)url;                           // UIApplicationDelegate
      - (UITableRowIndexSet *)tableView:(NSTableView *)tableView
          willSelectRows:(UITableRowIndexSet *)selection;       // UITableViewDelegate
      - (NSRect)windowWillUseStandardFrame:(NSWindow *)window
          defaultFrame:(NSRect)newFrame;                        // NSWindow
      

      【讨论】:

        猜你喜欢
        • 2012-09-13
        • 2015-06-29
        • 2011-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-01
        • 1970-01-01
        相关资源
        最近更新 更多