1

问题是这样的:

我有一个视图控制器Controller 1,它是其他 2 个控制器Controller 2Controller 3的代表。

控制器 2有一个名为“FOO”的委托方法,控制器 3具有相同的方法。

如果两个“FOO”方法都告诉委托做同样的事情,我可以在控制器 1中实现一个“FOO”方法 吗?

谢谢

沙尼

4

3 回答 3

2

良好的委托设计意味着方法不应具有相同的名称。例如,如果我有两个名为FooAand的类FooB,它们都执行委托操作foobar:(BOOL)force,那么委托方法名称应如下所示:

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

这样,您的“控制器 1”将能够区分两种委托方法。您会在其他代表身上注意到这一点,例如UITableView

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

您可以区分是否shouldHighlightRowAtIndexPath来自一个UITableView或不同的类。

这么说来,完全有可能在两个委托之间共享一个方法名,只是委托不能确定委托的来源。

于 2012-10-23T16:19:40.073 回答
1

你能做这个吗?是的。你应该这样做吗?绝对没有。假设您的每个视图控制器都定义了一个协议,那么所有协议中的方法都应该被唯一命名。换句话说,如果控制器 2中的协议和控制器 3中的协议都有一个简单命名的方法,foo那么你做错了。你应该有controller1foo:controller2foo:

这就是为什么 - 虽然在控制器 1中您可能希望同时处理这两个,但在另一个控制器中您可能需要以不同方式处理它们。或者将来您可能会决定控制器 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];
}

这种方法使您可以对两种委托方法执行相同的操作,同时仍然可以在需要时选择执行不同的操作。

于 2012-10-23T16:20:00.597 回答
0

控制器 2 和 3 是该类的实例吗?

所以让我们假设控制器 2 是一个 DoSomethingController,而控制器 3 是一个 DoSomethingElseController,在这种情况下,您需要两个不同的委托方法。

相反,如果控制器 2 和 3 属于同一类,或者如果控制器的类之一是另一个类的子类,那么这也是可以的。示例:UITableView的子类UITableView可以与一个委托对象(控制器 1)共享tableView:cellForRowAtIndexPath:委托方法,这样就可以了。

于 2012-10-23T16:29:29.223 回答