6

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

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

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

因此,当 Obj A 按下按钮并调用委托方法时,该委托方法返回一个值是否是个好主意,在我的情况下是当前计数器?

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

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

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

我的实施有缺陷吗?

4

3 回答 3

5

我喜欢你的实现。

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

我想就 MVC 概念而言,实现的适当方法是:

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

  • B(委托人)根据需要采取行动,并向 A 发送一条消息“reloadData”。

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

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

  • A(视图)向 B(委托和数据源)发送消息并接收刷新视图所需的数据信息。
于 2013-03-19T11:54:45.260 回答
3

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

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

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

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

于 2013-03-19T11:48:06.027 回答
2

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

有许多委托返回非 void 值。

- (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
于 2013-03-19T11:50:43.940 回答