我有一个场景,Obj A向Obj B发送一个委托消息说按下按钮。 Obj B根据委托调用采取一些行动。
Obj A希望根据调用该委托消息后发生的结果在屏幕上显示某些内容。
Say Obj B维持一个计数器,表明该行动发生了多少次。
所以当Obj A按下按钮并调用委托方法时,该委托方法返回一个值是个好主意,在我的例子中是当前计数器吗?
以便Obj A可以显示计数器更新值。
在这种情况下,同一消息同时充当委托和数据源。
对我来说,Obj A是一个View,而Obj B是View Controller。
我的实施有缺陷吗?
答案 0 :(得分:5)
我喜欢你的实施。
即使它没有区分委托和数据源角色,它也会以更简单的方式组合它们。
我认为实现MVC概念的合适方式是:
A(视图)向B(代表)发送一条消息,说“我被点击”或类似的东西。
B(代理人)根据需要行事,并向A发回一条消息“reloadData”。
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