在Obj-C中委托方法签名,了解它们的C#等价物

时间:2013-05-05 19:10:46

标签: ios objective-c

我正在学习目标C.我试图在C#中找到与方法签名相同的东西。

我对UIViewControllerDelegate的以下签名感到困惑

- (BOOL)splitViewController:(UISplitViewController *)svc shouldHideViewController:(UIViewController *)vc inOrientation:(UIInterfaceOrientation)orientation

- (void)splitViewController:(UISplitViewController *)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)pc

那么,在C#中,这将相当于具有不同重载签名的2个方法名称splitViewController?

令人困惑,因为这些方法非常具有描述性......

拿第一个例子:

splitViewController是方法的名称,vc和orientation是我们传递给它的参数。 shouldHideViewController和inOrientation是在UISplitViewDelegate .h声明中声明它们的参数的名称。

上午,我对吗?试图确认我正在学习,我在这里得到了概念。

当人们引用他的第一个方法时,他们将其称为splitViewController:shouldHideViewController:inOrientation 这对我来说很奇怪,因为我们只是通过方法名称来引用一个方法并理解它有多个重载。在Obj-C中,这些不同的“重载”确实可以完全处理不同的事情,这对我来说是一种策略范式。

任何想法......

1 个答案:

答案 0 :(得分:5)

- (BOOL) splitViewController:(UISplitViewController *)svc 
    shouldHideViewController:(UIViewController *)vc 
               inOrientation:(UIInterfaceOrientation)orientation

方法名称:splitViewController:shouldHideViewController:inOrientation:
参数名称:svcvcorientation

Objective-C没有方法重载。您的代码显示了两种不同的方法。

  在Obj-C中,这些不同的“重载”会处理不同的事情   完全,这对我来说是一种策略范式。

这里的范例是委托,这是一种通过依赖另一个来扩展类行为的方法。

考虑这个想象中的API:

@interface TableDelegate
-(CGFloat)heightForRow:(NSUInteger)row;
@end

@interface Table
@property (weak) id<TableDelegate> delegate;
@end

这是一个具有委托属性的表对象。在构建表时,它会询问代表每行的高度。

@interface Controller <TableDelegate>{
    Table _table;
}
@end

@implementation Controller
-(instancetype)init {
    if (self=[super init]){
        _table = [Table new];
        _table.delegate = self;
    }
    return self;
}
-(CGFloat)heightForRow:(NSUInteger)row {
  return 10.f;
}
@end

这是一个管理表对象的控制器。它声明自己符合协议并将自身设置为表的委托。现在,您可以添加任何适合的逻辑来返回给定行的高度(在示例中,它返回一个固定值)。

我们没有子类,我们只能实现我们感兴趣的委托方法。