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
}