簡體   English   中英

委托可以為2個代表使用單一方法嗎?

[英]Can delegate use a single methods for 2 delegates?

問題是這樣的:

我有一個視圖控制器控制器1 ,它是另外兩個控制器控制器2控制器3的代表

控制器2具有稱為“FOO”的委托方法, 控制器3具有相同的方法。

如果兩個“FOO”方法都告訴委托做同樣的事情,我可以在Controller 1中實現一個“FOO”方法嗎?

謝謝

沙尼

良好的委托設計意味着方法不應該具有相同的名稱。 例如,如果我有兩個名為FooAFooB類,它們都執行委托動作foobar:(BOOL)force ,那么委托方法名稱應如下所示:

- (void)fooA:(FooA*)foo foobar:(BOOL)force;
- (void)fooB:(FooB*)foo foobar:(BOOL)force;

這樣,您的'Controller 1'將能夠區分兩種委托方法。 你會在其他代表中注意到這一點,例如UITableView

- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath

如果shouldHighlightRowAtIndexPath來自UITableView或其他類,您可以區分。

說到這一點,完全有可能在兩個委托之間共享一個方法名稱,只是委托人不確定委托的來源。

你能做這個嗎? 是。 你應該這樣做嗎? 絕對沒有。 假設每個視圖控制器都在定義一個協議,那么所有協議中的方法都應該是唯一命名的。 換句話說,如果Controller 2中的協議和Controller 3中的協議都有一個簡單命名為foo的方法,那么你做錯了。 你應該有controller1foo:controller2foo: .

這就是為什么 - 在Controller 1中你可能想要同時處理這兩者,有可能在另一個控制器中你需要以不同的方式處理它們。 或者在將來,您可能會認為Controller 1需要以不同方式處理它們。 如果兩個協議都定義了相同的方法,則無法以不同方式處理它們。

這是正確的解決方案。 為每個協議方法指定唯一名稱。 然后在Controller 1中 ,實現兩個委托方法。 但是,兩種委托方法的實現都將是調用實際工作的常用方法。

控制器1中

- (void)doTheCommonWork {
    // This method does the common processing of the delegate calls
}

#pragma mark Controller 2 methods
- (void)controller2foo:(Controller2 *)controller {
    [self doTheCommonWork];
}

#pragma mark Controller 3 methods
- (void)controller3foo:(Controller3 *)controller {
    [self doTheCommonWork];
}

這種方法允許您為兩個委托方法執行相同的操作,同時仍然可以選擇在需要時執行不同的操作。

控制器2和3是該類的實例嗎?

因此,假設Controller 2是DoSomethingController,Controller 3是DoSomethingElseController,在這種情況下,您需要兩種不同的委托方法。

相反,如果控制器2和3屬於同一類,或者如果其中一個控制器的類是另一個的子類,那么這也是可以的。 例如: UITableView和的一個子類UITableView可以共享tableView:cellForRowAtIndexPath:委托方法與一個委托對象(控制器1),這將是就好了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM