2

我正在学习目标 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 这对来自 C# 的我来说很奇怪,因为我们只会通过方法名称来引用一个方法并理解它有多个重载。另外,在 Obj-C 中,这些不同的“重载”确实可以完全处理不同的事情,这对我来说是一个战略范式。

有什么想法吗...

4

1 回答 1

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

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

我们不必子类化,我们可以只实现我们感兴趣的委托方法。

于 2013-05-05T19:46:33.993 回答