委托消息是否必须始终具有void作为返回类型?

时间:2013-03-19 11:42:41

标签: ios objective-c design-patterns

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

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

Say Obj B维持一个计数器,表明该行动发生了多少次。

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

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

在这种情况下,同一消息同时充当委托和数据源。

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

我的实施有缺陷吗?

3 个答案:

答案 0 :(得分:5)

我喜欢你的实施。

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

我认为实现MVC概念的合适方式是:

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

  • B(代理人)根据需要行事,并向A发回一条消息“reloadData”。

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

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

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

答案 1 :(得分:3)

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

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

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

但很多其他组件都这样做,所以他们不必太专业,但所以他们可以保持通用

答案 2 :(得分:2)

不是规则,委托人应该返回无效。

有许多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