ios objective-c 编程中对委托的困惑
Confusion about delegates in ios objective-c programming
我对 objective-C 和 iOS 开发还很陌生。我有些困惑。我正在学习教程,他在 IB 中创建了一个 UITableView。然后,他将用于将新 TableView 对象连接到 viewcontroller 的协议添加如下:
@interface viewController:UIViewCOntroller <UITableViewDelegate, UITableViewData>
然后他在 viewController 实现中实现了其中一个协议所需的方法:
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
我的问题很简单,这个定义中的每个标识符是什么。我的理解是要求的方法是"cellForRowAtIndexPath"。据我所知 objective-c 这种语法意味着 tableView 是这个方法的名称,它 returns (UITableViewCell) 并接受一个 UITableView 对象 "tableView"。我知道如果需要实现的方法是"cellForRowAtIndexPath",那是不正确的。在那之后,语法让我感到困惑。我觉得自己很笨,我已经编程多年了,但我无法理解其中的一些 xcode 和 iOS 应用程序结构概念。基本上我只需要对此语法进行全面说明。谢谢
这样想。 Objective C 中的委托/协议只不过是 OOP 中的一个接口。
Objective C 是一种非常冗长的语言。最初,它很难理解,但一旦你克服了文化冲击,就会有一种我喜欢的描述性美。
你的方法不是'tableView'。您的方法是“一个 tableView 想知道要为这个 indexPath 呈现哪个单元格”。明白我的意思了吗?
您为 iOS 编写方法(或 Objective C 中的消息)的方式非常具有描述性。
在 Java 中,您将传入多个参数,例如:
methodName(type1 param1, type2 param2, ...)
在Objective C中是:
- (returnType)thisMethodDoesThingsWhichNeeds:(type1)thingIneed1 andAnotherThingItNeedsIs:(type2)thingINeed2 ....
按照这种方法,您的情况是这样的:
- 您的 viewController
上需要一个 tableView
- 没错。 tableView 无法独立思考。它需要有人为其渲染和构建单元格 (viewController)。
- 它还需要一个数据源(又是你的viewController)。
- 所以你告诉你的 nib 文件上的 tableView 这个 viewController 是它的委托和 dataSource。
现在,当您分配 tableView 时,它知道它的委托和数据源属性已准备就绪,因此它开始向您的对象发送消息,例如
:
一个。我需要知道我在特定部分中有多少行 -
tableView:numberOfRowsInSection:
b。嘿,我需要知道这一行的高度是多少 -
tableView:heightForRowAtIndexPath:
c。嘿,谁能告诉我当用户选择此单元格时该怎么做 - tableView:didSelectRowAtIndexPath:
...等等
还有,你注意到我是怎么写这些方法的了吗?不只是 tableView
...它是 tableView:cellForRowAtIndexPath:
。这就是你的方法。
清空你的头脑,试着理解一些语法背后的原因,你会爱上你所学的:)
对不起,如果我的回答到处都是,但你的问题很开放。
更直接的回答你的问题:
(UITableViewCell*):这是return类型。 tableView 正在询问
你创建一个单元格并 return 它。
tableView:(UITableView *): 这是你的tableView
viewController 是代表。你为什么要参考
表视图?这是因为一个 viewController 可以有多个
tableViews 所以你需要知道哪个 tableView 需要东西。
cellForRowAtIndexPath: tableView 正在给它的委托更多
有助于它满足请求的信息。它告诉
viewController 单元格的索引路径。这样,例如,如果
你有一个 NSArray 作为 tableView 的数据,你会知道
要在 tableViewCell 上显示的数据的索引。
如果您有兴趣,请阅读更多内容 - https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/WorkingwithProtocols/WorkingwithProtocols.html
Objective C 方法在阅读时应该听起来像一个陈述或问题。这使它们变得冗长并且还为每个参数添加了名称。学习它时最大的心理障碍是方法实际上是分开的。举个例子:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
正如上面指出的,名字不是tableView
,而是tableView:cellForRowAtIndexPath:
。请注意冒号包含在名称中。这很重要,这意味着将传入一个参数。此方法的名称中有 2 个冒号,因此它将有两个参数。其他有趣的一点是,这个方法定义中使用的类型都在括号中,第一个字符表示它是什么类型的函数。 +
表示 class 方法(静态函数),-
表示实例方法。
如果它是用另一种 C 类型语言(如 Java、C++ 或 C#)编写的,它将是
UITableViewCell * tableViewCellForRowAtIndexPath(UITableView *tableView, NSIndexPath *indexPath)
所以回到方法上,让我们分解一下。首先,它是一个实例方法。接下来是 return 类型。 (那是未命名的。)现在我们来看看函数名和参数。现在会有
- 一个标签
- 冒号
- 一种
- 一个论点
这将对方法中的每个参数重复。回到例子。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
- [
-
] 是一个实例方法
- [
(UITableViewCell *)
] 它 return 是一个指向 UITableViewCell 类型对象的指针
- [
tableView
] 部分方法名
- [
:
] 表示有参数来了
- [
(UITableView *)
] 参数类型
- [
tableView
] 参数名称
- [
cellForRowAtIndexPath
] 部分方法名
- [
:
] 说明有参数来了
- [
(NSIndexPath *)
] 参数类型
- [
indexPath
] 参数名称
上面的例外是不带任何参数的方法。它们将只有一个标签,没有尾随冒号或类型。即 - (UIView *)view
此方法的名称是 view
(名称中也没有尾随冒号。)
我对 objective-C 和 iOS 开发还很陌生。我有些困惑。我正在学习教程,他在 IB 中创建了一个 UITableView。然后,他将用于将新 TableView 对象连接到 viewcontroller 的协议添加如下:
@interface viewController:UIViewCOntroller <UITableViewDelegate, UITableViewData>
然后他在 viewController 实现中实现了其中一个协议所需的方法:
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
我的问题很简单,这个定义中的每个标识符是什么。我的理解是要求的方法是"cellForRowAtIndexPath"。据我所知 objective-c 这种语法意味着 tableView 是这个方法的名称,它 returns (UITableViewCell) 并接受一个 UITableView 对象 "tableView"。我知道如果需要实现的方法是"cellForRowAtIndexPath",那是不正确的。在那之后,语法让我感到困惑。我觉得自己很笨,我已经编程多年了,但我无法理解其中的一些 xcode 和 iOS 应用程序结构概念。基本上我只需要对此语法进行全面说明。谢谢
这样想。 Objective C 中的委托/协议只不过是 OOP 中的一个接口。
Objective C 是一种非常冗长的语言。最初,它很难理解,但一旦你克服了文化冲击,就会有一种我喜欢的描述性美。
你的方法不是'tableView'。您的方法是“一个 tableView 想知道要为这个 indexPath 呈现哪个单元格”。明白我的意思了吗?
您为 iOS 编写方法(或 Objective C 中的消息)的方式非常具有描述性。
在 Java 中,您将传入多个参数,例如:
methodName(type1 param1, type2 param2, ...)
在Objective C中是:
- (returnType)thisMethodDoesThingsWhichNeeds:(type1)thingIneed1 andAnotherThingItNeedsIs:(type2)thingINeed2 ....
按照这种方法,您的情况是这样的:
- 您的 viewController 上需要一个 tableView
- 没错。 tableView 无法独立思考。它需要有人为其渲染和构建单元格 (viewController)。
- 它还需要一个数据源(又是你的viewController)。
- 所以你告诉你的 nib 文件上的 tableView 这个 viewController 是它的委托和 dataSource。
现在,当您分配 tableView 时,它知道它的委托和数据源属性已准备就绪,因此它开始向您的对象发送消息,例如 :
一个。我需要知道我在特定部分中有多少行 -
tableView:numberOfRowsInSection:
b。嘿,我需要知道这一行的高度是多少 -
tableView:heightForRowAtIndexPath:
c。嘿,谁能告诉我当用户选择此单元格时该怎么做 -
tableView:didSelectRowAtIndexPath:
...等等
还有,你注意到我是怎么写这些方法的了吗?不只是 tableView
...它是 tableView:cellForRowAtIndexPath:
。这就是你的方法。
清空你的头脑,试着理解一些语法背后的原因,你会爱上你所学的:)
对不起,如果我的回答到处都是,但你的问题很开放。
更直接的回答你的问题:
(UITableViewCell*):这是return类型。 tableView 正在询问 你创建一个单元格并 return 它。
tableView:(UITableView *): 这是你的tableView viewController 是代表。你为什么要参考 表视图?这是因为一个 viewController 可以有多个 tableViews 所以你需要知道哪个 tableView 需要东西。
cellForRowAtIndexPath: tableView 正在给它的委托更多 有助于它满足请求的信息。它告诉 viewController 单元格的索引路径。这样,例如,如果 你有一个 NSArray 作为 tableView 的数据,你会知道 要在 tableViewCell 上显示的数据的索引。
如果您有兴趣,请阅读更多内容 - https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/WorkingwithProtocols/WorkingwithProtocols.html
Objective C 方法在阅读时应该听起来像一个陈述或问题。这使它们变得冗长并且还为每个参数添加了名称。学习它时最大的心理障碍是方法实际上是分开的。举个例子:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
正如上面指出的,名字不是tableView
,而是tableView:cellForRowAtIndexPath:
。请注意冒号包含在名称中。这很重要,这意味着将传入一个参数。此方法的名称中有 2 个冒号,因此它将有两个参数。其他有趣的一点是,这个方法定义中使用的类型都在括号中,第一个字符表示它是什么类型的函数。 +
表示 class 方法(静态函数),-
表示实例方法。
如果它是用另一种 C 类型语言(如 Java、C++ 或 C#)编写的,它将是
UITableViewCell * tableViewCellForRowAtIndexPath(UITableView *tableView, NSIndexPath *indexPath)
所以回到方法上,让我们分解一下。首先,它是一个实例方法。接下来是 return 类型。 (那是未命名的。)现在我们来看看函数名和参数。现在会有
- 一个标签
- 冒号
- 一种
- 一个论点
这将对方法中的每个参数重复。回到例子。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
- [
-
] 是一个实例方法 - [
(UITableViewCell *)
] 它 return 是一个指向 UITableViewCell 类型对象的指针 - [
tableView
] 部分方法名- [
:
] 表示有参数来了 - [
(UITableView *)
] 参数类型 - [
tableView
] 参数名称
- [
- [
cellForRowAtIndexPath
] 部分方法名- [
:
] 说明有参数来了 - [
(NSIndexPath *)
] 参数类型 - [
indexPath
] 参数名称
- [
上面的例外是不带任何参数的方法。它们将只有一个标签,没有尾随冒号或类型。即 - (UIView *)view
此方法的名称是 view
(名称中也没有尾随冒号。)