2013-03-19 63 views
6

我有一个场景,其中Obj A发送委托消息给Obj B说按下一个按钮。 Obj B根据委托调用采取一些操作。委托消息是否有必要始终具有void作为返回类型?

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

说Obj乙维护一个计数器,该行为发生了多少次。

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

这样Obj A就可以显示计数器的更新值。

在这种情况下,同一个消息既充当Delegate又充当DataSource。

对我来说Obj A是一个View和Obj B是View Controller。

我的执行是否有缺陷?

+1

代表是绝对没有特别的。它只是一个包含你想访问的函数的类/实例/方法。例如,您可以将盒子的文件系统视为一组代表 - 您可以给他们打电话并执行服务。 – 2013-03-19 11:51:36

回答

5

我喜欢你的实现。

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

我想尽可能的MVC概念,是落实适当的方式:

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

  • B(代表)根据需要发挥作用,并向A发送一条消息,指出“reloadData”。

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

因为在你的情况下,委托和数据源是相同的对象,因为它在许多其他情况下发生的,在我看来非常合理的,而不是在所有有缺陷的像你一样实现流程:

  • A(视图)向B(代理&数据源)发送消息并接收刷新视图所需的数据信息。
3

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

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

但许多其他组件这样做,所以他们不必太专业,但这样他们就可以仍然是通用的

2

不,它不是一个规则,一个delgate应该返回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