委托可以为2个代表使用单一方法吗?

时间:2012-10-23 16:05:24

标签: ios delegates

问题是:

我有一个视图控制器控制器1 ,它是另外两个控制器控制器2 控制器3 的代表。

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

如果两个“FOO”方法告诉代表做同样的事情,我可以在 Controller 1 中实现一个“FOO”方法吗?

由于

沙尼

3 个答案:

答案 0 :(得分:2)

良好的委托设计意味着方法不应具有相同的名称。例如,如果我有两个名为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或其他类别。

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

答案 1 :(得分:1)

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

这就是为什么 - 在控制器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 :(得分:0)

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

因此,假设Controller 2是DoSomethingController,Controller 3是DoSomethingElseController,在这种情况下,您需要两种不同的委托方法。

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