Objective-C 学习笔记 | 协议(property)

Objective-C 学习笔记 | 协议(property)

Objective-C 学习笔记 | 协议(property)

iOS 应用经常会用 UITableView 实例来显示数据,但是它本身不包含数据,必须从辅助对象处获取。因此,程序必须给

UITableView 对象指定数据源对象,这个对象将扮演数据源的角色。

请添加图片描述

协议可以为一个对象指定角色。协议是一组方法声明,其中的部分方法是必须的,而另一些方法是可选的。如果某个对象要扮演特定的角色,就一定要实现相应的必需方法(required method),并选择实现部分的可选方法(optional method)。

UITableView 的数据源协议就是 UITableViewDataSource,其声明的方法如下:

请添加图片描述

UITableView 类有 dataSource 属性,以下是它的声明:

@property(nonatomic, assign) id<UITableViewDataSource> dataSource;

所以 UITableView 的数据源对象可以是任意类型的对象,只要它遵从 UITableViewDataSource 协议,并实现了该协议的所有必需方法,编译器就认为该对象可以作为 UITableView 对象的数据源。

在创建用于 UITableView 数据源的新类时,需要在该类的头文件中明确说明:这个类遵守 UITableViewDataSource 协议:

@interface TerrificViewController : UIViewController
    <UITableViewDataSource, UITableViewDelegate, UITextFieldDelegate>
@end

接着,要在 TerrificViewController.m 中实现各个协议的必需方法。

如果表格给它的数据源发送了数据源没实现的可选方法的消息时,程序会崩溃。为了避免这种情况,UITableView 对象需要先询问数据源对象是否实现了某个可选方法。

比如,可以使用 respondsToSelector: 询问对象是否实现了某个方法,该方法在 NSObject 中实现了,所以可以给任意对象发送该消息。传入需要询问的方法的选择器,返回值是一个 BOOL:

if ([_dataSource respondsToSelector:@selector(numberOfSectionsInTableView:)]) {
    _numberOfSections = [_dataSource numberOfSectionsInTableView:self];
} else {
    _numberOfSections = 1; // 默认的段行为 1
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值