我正在学习目标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中,这些不同的“重载”确实可以完全处理不同的事情,这对我来说是一种策略范式。
任何想法......
答案 0 :(得分:5)
- (BOOL) splitViewController:(UISplitViewController *)svc
shouldHideViewController:(UIViewController *)vc
inOrientation:(UIInterfaceOrientation)orientation
方法名称:splitViewController:shouldHideViewController:inOrientation:
。
参数名称:svc
,vc
,orientation
。
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
这是一个管理表对象的控制器。它声明自己符合协议并将自身设置为表的委托。现在,您可以添加任何适合的逻辑来返回给定行的高度(在示例中,它返回一个固定值)。
我们没有子类,我们只能实现我们感兴趣的委托方法。