2013-03-19 62 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