tableView的常见属性
cell的常见属性
一、一般情况
1 #import "ViewController.h" 2 3 @interface ViewController ()<UITableViewDataSource,UITableViewDelegate> 4 5 @property (strong, nonatomic) UITableView *tableview; 6 7 @property (strong, nonatomic) NSArray *dataSource; 8 9 @end 10 11 /* 12 UITableView 13 表格视图:两个协议,两个代理,四个方法 14 15 两个协议: 16 1.数据源协议:(提供表格数据,提供表格内容)UITableViewDataSource 17 2.执行代理协议:(提供表格操作方法)UITableViewDelegate 18 */ 19 20 21 @implementation ViewController 22 23 #pragma mark - LifeCircle 24 - (void)viewDidLoad { 25 [super viewDidLoad]; 26 27 [self.view setBackgroundColor:[UIColor groupTableViewBackgroundColor]]; 28 29 self.tableview = [[UITableView alloc] initWithFrame:CGRectMake(0, 64, 375, 400) style:UITableViewStyleGrouped]; 30 31 self.tableview.delegate = self; 32 self.tableview.dataSource = self; 33 34 [self.view addSubview:self.tableview]; 35 36 NSArray *arr1 = @[@"芃,你好1",@"芃,你好2",@"芃,你好3",@"芃,你好4",@"芃,你好5"]; 37 NSArray *arr2 = @[@"芃,你好6",@"芃,你好7",@"芃,你好8",@"芃,你好9"]; 38 self.dataSource = @[arr1,arr2]; 39 40 41 } 42 43 #pragma mark - UITableViewDataSource 44 //组数 45 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 46 { 47 return [self.dataSource count]; 48 } 49 50 //设置每组行数 51 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 52 { 53 return [[self.dataSource objectAtIndex:section] count]; 54 } 55 56 // 设置[每一个]单元格方法 57 // 1.设置复用[单元格]ID 58 // 2.设置复用 59 // 3.创建单元格 60 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 61 { 62 // 1.设置复用[单元格]ID 63 static NSString *cellIdentifier = @"cellIdentifier"; 64 // 2.设置复用 65 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 66 // 3.创建单元格 67 if (!cell) { 68 cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; 69 } 70 cell.textLabel.text = [[self.dataSource objectAtIndex:indexPath.section] objectAtIndex:indexPath.row]; 71 cell.imageView.image = [UIImage imageNamed:@"1.jpg"]; 72 cell.detailTextLabel.text = @"张芃芃的信息"; 73 cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 74 75 76 return cell; 77 } 78 79 #pragma mark - UITableViewDelegate 80 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 81 { 82 //拿到点击的那一行 83 UITableViewCell *selectCell = [tableView cellForRowAtIndexPath:indexPath]; 84 85 NSString *titleInRow = [NSString stringWithFormat:@"%@",selectCell.textLabel.text]; 86 87 // NSString *titleInRow = [NSString stringWithFormat:@"%@",[[self.dataSource objectAtIndex:indexPath.section] objectAtIndex:indexPath.row]]; 88 89 UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"问候" message:titleInRow delegate:self cancelButtonTitle:@"你好" otherButtonTitles: nil]; 90 [alert show]; 91 } 92 93 @end
二、通过加载plist文件显示分组数据
1 #import <Foundation/Foundation.h> 2 3 @interface Group : NSObject 4 //组标题 5 @property (copy, nonatomic) NSString *title; 6 //组描述 7 @property (copy, nonatomic) NSString *desc; 8 //汽车品牌信息 9 @property (strong, nonatomic) NSArray *cars; 10 11 - (instancetype) initWithDict:(NSDictionary *)dict; 12 + (instancetype) groupWithDict:(NSDictionary *)dict; 13 14 @end 15 16 17 #import "Group.h" 18 19 @implementation Group 20 21 - (instancetype)initWithDict:(NSDictionary *)dict 22 { 23 self = [super init]; 24 if (self) { 25 // self.title = dict[@"title"]; 26 // self.desc = dict[@"desc"]; 27 // self.cars = dict[@"cars"]; 28 [self setValuesForKeysWithDictionary:dict]; 29 } 30 return self; 31 } 32 33 + (instancetype)groupWithDict:(NSDictionary *)dict 34 { 35 return [[self alloc] initWithDict:dict]; 36 } 37 38 @end 39 40 41 #import "ViewController.h" 42 #import "Group.h" 43 44 @interface ViewController ()<UITableViewDataSource> 45 46 @property (strong, nonatomic) NSArray *groups; 47 @property (strong, nonatomic) UITableView *tableView; 48 49 @end 50 51 @implementation ViewController 52 53 - (void)viewDidLoad { 54 [super viewDidLoad]; 55 self.tableView = [[UITableView alloc] initWithFrame:[UIScreen mainScreen].bounds]; 56 self.tableView.dataSource = self; 57 [self.view addSubview:self.tableView]; 58 59 } 60 61 #pragma mark - 数据源协议 62 63 //设置组数 64 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 65 { 66 return [self.groups count]; 67 } 68 //设置每组行数 69 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 70 { 71 Group *group = self.groups[section]; 72 return group.cars.count; 73 74 } 75 //设置每组每行内容 76 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 77 { 78 //1.设置复用单元格ID 79 static NSString *cellIdentifier = @"cellIdentifier"; 80 //2.设置复用 81 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 82 //3.创建单元格 83 if (!cell) { 84 cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier];
}
// 3.1获取模型数据 86 //获取模型 87 Group *group = self.groups[indexPath.section]; 88 //获取对应的汽车品牌 89 NSString *brand = group.cars[indexPath.row]; 90 // 3.2把模型中的数据设置给单元格中的子控件 91 cell.textLabel.text = brand; 92 93 94 return cell; 95 } 96 97 //组标题 98 - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section 99 { 100 Group *group = self.groups[section]; 101 return group.title; 102 } 103 //设置组尾 104 - (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section 105 { 106 Group *group = self.groups[section]; 107 return group.desc; 108 } 109 110 111 #pragma mark - 懒加载 112 - (NSArray *)groups 113 { 114 if (_groups == nil) { 115 // 1.找到plist文件的路径 116 NSString *path = [[NSBundle mainBundle] pathForResource:@"cars_simple.plist" ofType:nil]; 117 // 2.加载plist文件 118 NSArray *array = [NSArray arrayWithContentsOfFile:path]; 119 // 3.字典转模型 120 NSMutableArray *arrayModel = [NSMutableArray array]; 121 // 4.遍历字典数组中的每个字典,把每个字典转成模型,把模型放到arrayModel 122 for (NSDictionary *tempDict in array) { 123 //创建模型对象 124 Group *model = [[Group alloc] initWithDict:tempDict]; 125 [arrayModel addObject:model]; 126 } 127 _groups =arrayModel; 128 129 } 130 return _groups; 131 } 132 133 #pragma mark - 设置状态栏文字的颜色 134 - (UIStatusBarStyle)preferredStatusBarStyle 135 { 136 return UIStatusBarStyleLightContent; 137 } 138 139 #pragma mark - 隐藏状态栏 140 - (BOOL)prefersStatusBarHidden 141 { 142 return YES; 143 } 144 145 - (void)didReceiveMemoryWarning { 146 [super didReceiveMemoryWarning]; 147 // Dispose of any resources that can be recreated. 148 } 149 150 @end
三、通过加载plist文件展示单组数据
1 #import <Foundation/Foundation.h> 2 3 @interface HMLOL : NSObject 4 @property (nonatomic, copy) NSString *icon; 5 @property (nonatomic, copy) NSString *name; 6 @property (nonatomic, copy) NSString *intro; 7 8 - (instancetype)initWithDict:(NSDictionary *)dict; 9 + (instancetype)lolWithDict:(NSDictionary *)dict; 10 @end 11 12 #import "HMLOL.h" 13 14 @implementation HMLOL 15 - (instancetype)initWithDict:(NSDictionary *)dict 16 { 17 self = [super init]; 18 if (self) { 19 [self setValuesForKeysWithDictionary:dict]; 20 } 21 return self; 22 } 23 24 + (instancetype)lolWithDict:(NSDictionary *)dict { 25 return [[self alloc] initWithDict:dict]; 26 } 27 @end 28 29 30 #import "ViewController.h" 31 #import "HMLOL.h" 32 @interface ViewController ()<UITableViewDataSource> 33 @property (weak, nonatomic) IBOutlet UITableView *tableView; 34 // 存放所有模型数据 35 @property (nonatomic, strong) NSArray *heroes; 36 @end 37 38 @implementation ViewController 39 40 - (void)viewDidLoad { 41 [super viewDidLoad]; 42 43 // 1.设置数据源 44 self.tableView.dataSource = self; 45 } 46 47 48 // 49 //- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 50 // return 1; 51 //} 52 53 // 返回多少行 54 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 55 return self.heroes.count; 56 } 57 58 59 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 60 // 1.创建cell 61 UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:nil]; 62 63 // 2.取出模型中的数据设置给cell 64 HMLOL *hero = self.heroes[indexPath.row]; 65 // cell内部显示内容的三个子控件 66 cell.textLabel.text = hero.name; 67 cell.imageView.image = [UIImage imageNamed:hero.icon]; 68 cell.detailTextLabel.text = hero.intro; 69 70 // 设置辅助视图的样式 71 // cell.accessoryType = UITableViewCellAccessoryNone; 72 // 设置自定义的辅助视图 73 // cell.accessoryView = [UIButton buttonWithType:UIButtonTypeContactAdd]; 74 // 3.返回给tabelView 75 return cell; 76 } 77 78 79 #pragma mark - 懒加载 80 - (NSArray *)heroes { 81 if (_heroes == nil) { 82 NSArray *dictArr = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"heros.plist" ofType:nil]]; 83 NSMutableArray *arrM = [NSMutableArray arrayWithCapacity:dictArr.count]; 84 for (NSDictionary *dict in dictArr) { 85 HMLOL *hero = [HMLOL lolWithDict:dict]; 86 [arrM addObject:hero]; 87 } 88 _heroes = arrM; 89 } 90 return _heroes; 91 } 92 @end
四、汽车品牌展示
1 #import <UIKit/UIKit.h> 2 3 @interface BWCar : UIView 4 @property (nonatomic, copy) NSString *name; 5 @property (nonatomic, copy) NSString *icon; 6 7 -(instancetype) initWithDict:(NSDictionary *)dict; 8 +(instancetype) carWithDict:(NSDictionary *)dict; 9 10 @end 11 12 #import "BWCar.h" 13 14 @implementation BWCar 15 16 - (instancetype)initWithDict:(NSDictionary *)dict 17 { 18 if (self = [super init]) { 19 [self setValuesForKeysWithDictionary:dict]; 20 } 21 return self; 22 } 23 24 + (instancetype)carWithDict:(NSDictionary *)dict 25 { 26 return [[self alloc] initWithDict:dict]; 27 } 28 29 @end 30 31 32 33 #import <UIKit/UIKit.h> 34 35 @interface BWGroup : UIView 36 37 @property (nonatomic, copy) NSString *title; 38 @property (nonatomic, strong) NSArray *cars; 39 40 - (instancetype) initWithDict:(NSDictionary *)dict; 41 + (instancetype) groupWithDict:(NSDictionary *)dict; 42 43 @end 44 45 #import "BWGroup.h" 46 #import "BWCar.h" 47 48 @implementation BWGroup 49 50 - (instancetype)initWithDict:(NSDictionary *)dict 51 { 52 if (self = [super init]) { 53 [self setValuesForKeysWithDictionary:dict]; 54 //当有模型嵌套的时候需要手动把字典转模型 55 //模型数组 56 NSMutableArray *arrayModels = [NSMutableArray array]; 57 //字典转模型 58 for (NSDictionary *tempDict in self.cars) { 59 BWCar *model = [[BWCar alloc] initWithDict:tempDict]; 60 [arrayModels addObject:model]; 61 } 62 self.cars = arrayModels; 63 } 64 65 return self; 66 } 67 68 + (instancetype)groupWithDict:(NSDictionary *)dict 69 { 70 return [[self alloc] initWithDict:dict]; 71 } 72 73 @end 74 75 #import "ViewController.h" 76 #import "BWCar.h" 77 #import "BWGroup.h" 78 79 80 @interface ViewController ()<UITableViewDataSource,UITableViewDelegate,UIAlertViewDelegate> 81 82 @property (nonatomic, strong) NSArray *groups; 83 @property (nonatomic, strong) UITableView *tableView; 84 @property (nonatomic, strong) NSIndexPath *indexPath; 85 86 @end 87 88 @implementation ViewController 89 90 #pragma mark - 懒加载数据 91 - (NSArray *)groups 92 { 93 if (_groups == nil) { 94 95 NSString *path = [[NSBundle mainBundle] pathForResource:@"cars_total.plist" ofType:nil]; 96 NSArray *arr = [NSArray arrayWithContentsOfFile:path]; 97 NSMutableArray *arrayModels = [NSMutableArray array]; 98 for (NSDictionary *dict in arr) { 99 BWGroup *group = [BWGroup groupWithDict:dict]; 100 [arrayModels addObject:group]; 101 } 102 _groups = arrayModels; 103 } 104 return _groups; 105 } 106 107 - (void)viewDidLoad { 108 [super viewDidLoad]; 109 110 self.tableView = [[UITableView alloc] initWithFrame:[UIScreen mainScreen].bounds style:UITableViewStyleGrouped]; 111 self.tableView.dataSource =self; 112 self.tableView.delegate =self; 113 114 [self.view addSubview:self.tableView]; 115 116 117 } 118 #pragma mark - 数据源方法 119 //加载数组数 120 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 121 { 122 return self.groups.count; 123 } 124 //加载每组行数 125 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 126 { 127 BWGroup *group = [self.groups objectAtIndex:section]; 128 return group.cars.count; 129 } 130 131 //加载单元格数据 132 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 133 { 134 // 1.创建单元格 135 136 // 1.1 声明重用ID 137 static NSString *cellIdentifier = @"cellIdentifier"; 138 // 1.2 根据重用ID去缓存池中取对应的cell对象 139 UITableViewCell *cell =[tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 140 // 1.3 如果没有取到,就创建一个cell 141 if (!cell) { 142 cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier]; 143 } 144 // 2.设置单元格内容 145 146 // 2.1 取数据模型 147 BWGroup *group = self.groups[indexPath.section]; 148 BWCar *car = group.cars[indexPath.row]; 149 150 // 2.2 加载单元格内容 151 cell.textLabel.text = car.name; 152 cell.imageView.image = [UIImage imageNamed:car.icon]; 153 154 // 3.返回单元格 155 return cell; 156 } 157 158 //加载组标题 159 - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section 160 { 161 BWGroup *group = [self.groups objectAtIndex:section]; 162 return group.title; 163 } 164 165 //设置右侧索引兰 166 - (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView 167 { 168 return [self.groups valueForKey:@"title"]; 169 } 170 171 172 173 #pragma mark - 代理方法 174 //监听行被选中的代理方法 175 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 176 { 177 //引用indexPath 178 self.indexPath = indexPath; 179 180 //获取当前被选中行的车的对象 181 BWGroup *group = self.groups[indexPath.section]; 182 BWCar *car = group.cars[indexPath.row]; 183 184 //创建一个对话框对象 185 UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"编辑" message:nil delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定",nil]; 186 187 188 189 //修改UIAlertView的样式 190 alert.alertViewStyle = UIAlertViewStylePlainTextInput; 191 //获取那个文本框,并且设置文本框中的文字为car.name 192 [alert textFieldAtIndex:0].text = car.name; 193 //显示对话框 194 [alert show]; 195 } 196 //UIAlertView的按钮被点击了,就会执行 197 - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 198 { 199 //表示点击的是"确定" 200 if (buttonIndex == 1) { 201 // 更新数据 202 // 1.获取用户文本框中的内容 203 NSString *name = [alertView textFieldAtIndex:0].text; 204 205 // 2.找到对应的车模型 206 // BWCar *car = self.groups[alertView.tag]; 207 BWGroup *group = self.groups[self.indexPath.section]; 208 BWCar *car = group.cars[self.indexPath.row]; 209 // NSLog(@"%@",self.indexPath); 210 211 // 3.修改车模型的name 212 car.name = name; 213 214 // 4.刷新tableView(重新调用UITableView的数据源对象中的数据源方法) 215 216 // reloadData刷新整个tableView 217 // [self.tableView reloadData]; 218 219 //局部刷新 220 //创建一个行对象 221 NSIndexPath *indexPath = [NSIndexPath indexPathForRow:self.indexPath.row inSection:self.indexPath.section]; 222 [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationLeft]; 223 } 224 } 225 226 @end
五、UITableView的API
1 // 2 // UITableView.h 3 // UIKit 4 // 5 // Copyright (c) 2005-2014 Apple Inc. All rights reserved. 6 // 7 8 #import <Foundation/Foundation.h> 9 #import <CoreGraphics/CoreGraphics.h> 10 #import <UIKit/UIScrollView.h> 11 #import <UIKit/UISwipeGestureRecognizer.h> 12 #import <UIKit/UITableViewCell.h> 13 #import <UIKit/UIKitDefines.h> 14 15 typedef NS_ENUM(NSInteger, UITableViewStyle) { 16 UITableViewStylePlain, // regular table view 17 UITableViewStyleGrouped // preferences style table view 18 }; 19 20 typedef NS_ENUM(NSInteger, UITableViewScrollPosition) { 21 UITableViewScrollPositionNone, 22 UITableViewScrollPositionTop, 23 UITableViewScrollPositionMiddle, 24 UITableViewScrollPositionBottom 25 }; // scroll so row of interest is completely visible at top/center/bottom of view 26 27 typedef NS_ENUM(NSInteger, UITableViewRowAnimation) { 28 UITableViewRowAnimationFade, 29 UITableViewRowAnimationRight, // slide in from right (or out to right) 30 UITableViewRowAnimationLeft, 31 UITableViewRowAnimationTop, 32 UITableViewRowAnimationBottom, 33 UITableViewRowAnimationNone, // available in iOS 3.0 34 UITableViewRowAnimationMiddle, // available in iOS 3.2. attempts to keep cell centered in the space it will/did occupy 35 UITableViewRowAnimationAutomatic = 100 // available in iOS 5.0. chooses an appropriate animation style for you 36 }; 37 38 // Including this constant string in the array of strings returned by sectionIndexTitlesForTableView: will cause a magnifying glass icon to be displayed at that location in the index. 39 // This should generally only be used as the first title in the index. 40 UIKIT_EXTERN NSString *const UITableViewIndexSearch NS_AVAILABLE_IOS(3_0); 41 42 // Returning this value from tableView:heightForHeaderInSection: or tableView:heightForFooterInSection: results in a height that fits the value returned from 43 // tableView:titleForHeaderInSection: or tableView:titleForFooterInSection: if the title is not nil. 44 UIKIT_EXTERN const CGFloat UITableViewAutomaticDimension NS_AVAILABLE_IOS(5_0); 45 46 @class UITableView; 47 @class UINib; 48 @protocol UITableViewDataSource; 49 @class UILongPressGestureRecognizer; 50 @class UITableViewHeaderFooterView; 51 @class UIRefreshControl; 52 @class UIVisualEffect; 53 54 typedef NS_ENUM(NSInteger, UITableViewRowActionStyle) { 55 UITableViewRowActionStyleDefault = 0, 56 UITableViewRowActionStyleDestructive = UITableViewRowActionStyleDefault, 57 UITableViewRowActionStyleNormal 58 } NS_ENUM_AVAILABLE_IOS(8_0); 59 60 NS_CLASS_AVAILABLE_IOS(8_0) @interface UITableViewRowAction : NSObject <NSCopying> 61 62 + (instancetype)rowActionWithStyle:(UITableViewRowActionStyle)style title:(NSString *)title handler:(void (^)(UITableViewRowAction *action, NSIndexPath *indexPath))handler; 63 64 @property (nonatomic, readonly) UITableViewRowActionStyle style; 65 @property (nonatomic, copy) NSString *title; 66 @property (nonatomic, copy) UIColor *backgroundColor; // default background color is dependent on style 67 @property (nonatomic, copy) UIVisualEffect* backgroundEffect; 68 69 @end 70 71 //_______________________________________________________________________________________________________________ 72 // this represents the display and behaviour of the cells. 73 74 @protocol UITableViewDelegate<NSObject, UIScrollViewDelegate> 75 76 @optional 77 78 // Display customization 79 80 - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath; 81 - (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section NS_AVAILABLE_IOS(6_0); 82 - (void)tableView:(UITableView *)tableView willDisplayFooterView:(UIView *)view forSection:(NSInteger)section NS_AVAILABLE_IOS(6_0); 83 - (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath*)indexPath NS_AVAILABLE_IOS(6_0); 84 - (void)tableView:(UITableView *)tableView didEndDisplayingHeaderView:(UIView *)view forSection:(NSInteger)section NS_AVAILABLE_IOS(6_0); 85 - (void)tableView:(UITableView *)tableView didEndDisplayingFooterView:(UIView *)view forSection:(NSInteger)section NS_AVAILABLE_IOS(6_0); 86 87 // Variable height support 88 89 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath; 90 - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section; 91 - (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section; 92 93 // Use the estimatedHeight methods to quickly calcuate guessed values which will allow for fast load times of the table. 94 // If these methods are implemented, the above -tableView:heightForXXX calls will be deferred until views are ready to be displayed, so more expensive logic can be placed there. 95 - (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(7_0); 96 - (CGFloat)tableView:(UITableView *)tableView estimatedHeightForHeaderInSection:(NSInteger)section NS_AVAILABLE_IOS(7_0); 97 - (CGFloat)tableView:(UITableView *)tableView estimatedHeightForFooterInSection:(NSInteger)section NS_AVAILABLE_IOS(7_0); 98 99 // Section header & footer information. Views are preferred over title should you decide to provide both 100 101 - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section; // custom view for header. will be adjusted to default or specified header height 102 - (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section; // custom view for footer. will be adjusted to default or specified footer height 103 104 // Accessories (disclosures). 105 106 - (UITableViewCellAccessoryType)tableView:(UITableView *)tableView accessoryTypeForRowWithIndexPath:(NSIndexPath *)indexPath NS_DEPRECATED_IOS(2_0, 3_0); 107 - (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath; 108 109 // Selection 110 111 // -tableView:shouldHighlightRowAtIndexPath: is called when a touch comes down on a row. 112 // Returning NO to that message halts the selection process and does not cause the currently selected row to lose its selected look while the touch is down. 113 - (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(6_0); 114 - (void)tableView:(UITableView *)tableView didHighlightRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(6_0); 115 - (void)tableView:(UITableView *)tableView didUnhighlightRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(6_0); 116 117 // Called before the user changes the selection. Return a new indexPath, or nil, to change the proposed selection. 118 - (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath; 119 - (NSIndexPath *)tableView:(UITableView *)tableView willDeselectRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(3_0); 120 // Called after the user changes the selection. 121 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath; 122 - (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(3_0); 123 124 // Editing 125 126 // Allows customization of the editingStyle for a particular cell located at 'indexPath'. If not implemented, all editable cells will have UITableViewCellEditingStyleDelete set for them when the table has editing property set to YES. 127 - (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath; 128 - (NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(3_0); 129 - (NSArray *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(8_0); // supercedes -tableView:titleForDeleteConfirmationButtonForRowAtIndexPath: if return value is non-nil 130 131 // Controls whether the background is indented while editing. If not implemented, the default is YES. This is unrelated to the indentation level below. This method only applies to grouped style table views. 132 - (BOOL)tableView:(UITableView *)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath; 133 134 // The willBegin/didEnd methods are called whenever the 'editing' property is automatically changed by the table (allowing insert/delete/move). This is done by a swipe activating a single row 135 - (void)tableView:(UITableView*)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath; 136 - (void)tableView:(UITableView*)tableView didEndEditingRowAtIndexPath:(NSIndexPath *)indexPath; 137 138 // Moving/reordering 139 140 // Allows customization of the target row for a particular row as it is being moved/reordered 141 - (NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath; 142 143 // Indentation 144 145 - (NSInteger)tableView:(UITableView *)tableView indentationLevelForRowAtIndexPath:(NSIndexPath *)indexPath; // return 'depth' of row for hierarchies 146 147 // Copy/Paste. All three methods must be implemented by the delegate. 148 149 - (BOOL)tableView:(UITableView *)tableView shouldShowMenuForRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(5_0); 150 - (BOOL)tableView:(UITableView *)tableView canPerformAction:(SEL)action forRowAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender NS_AVAILABLE_IOS(5_0); 151 - (void)tableView:(UITableView *)tableView performAction:(SEL)action forRowAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender NS_AVAILABLE_IOS(5_0); 152 153 @end 154 155 UIKIT_EXTERN NSString *const UITableViewSelectionDidChangeNotification; 156 157 158 //_______________________________________________________________________________________________________________ 159 160 NS_CLASS_AVAILABLE_IOS(2_0) @interface UITableView : UIScrollView <NSCoding> 161 162 - (instancetype)initWithFrame:(CGRect)frame style:(UITableViewStyle)style; // must specify style at creation. -initWithFrame: calls this with UITableViewStylePlain 163 164 @property (nonatomic, readonly) UITableViewStyle style; 165 @property (nonatomic, assign) id <UITableViewDataSource> dataSource; 166 @property (nonatomic, assign) id <UITableViewDelegate> delegate; 167 @property (nonatomic) CGFloat rowHeight; // will return the default value if unset 168 @property (nonatomic) CGFloat sectionHeaderHeight; // will return the default value if unset 169 @property (nonatomic) CGFloat sectionFooterHeight; // will return the default value if unset 170 @property (nonatomic) CGFloat estimatedRowHeight NS_AVAILABLE_IOS(7_0); // default is 0, which means there is no estimate 171 @property (nonatomic) CGFloat estimatedSectionHeaderHeight NS_AVAILABLE_IOS(7_0); // default is 0, which means there is no estimate 172 @property (nonatomic) CGFloat estimatedSectionFooterHeight NS_AVAILABLE_IOS(7_0); // default is 0, which means there is no estimate 173 @property (nonatomic) UIEdgeInsets separatorInset NS_AVAILABLE_IOS(7_0) UI_APPEARANCE_SELECTOR; // allows customization of the frame of cell separators 174 175 @property(nonatomic, readwrite, retain) UIView *backgroundView NS_AVAILABLE_IOS(3_2); // the background view will be automatically resized to track the size of the table view. this will be placed as a subview of the table view behind all cells and headers/footers. default may be non-nil for some devices. 176 177 // Data 178 179 - (void)reloadData; // reloads everything from scratch. redisplays visible rows. because we only keep info about visible rows, this is cheap. will adjust offset if table shrinks 180 - (void)reloadSectionIndexTitles NS_AVAILABLE_IOS(3_0); // reloads the index bar. 181 182 // Info 183 184 - (NSInteger)numberOfSections; 185 - (NSInteger)numberOfRowsInSection:(NSInteger)section; 186 187 - (CGRect)rectForSection:(NSInteger)section; // includes header, footer and all rows 188 - (CGRect)rectForHeaderInSection:(NSInteger)section; 189 - (CGRect)rectForFooterInSection:(NSInteger)section; 190 - (CGRect)rectForRowAtIndexPath:(NSIndexPath *)indexPath; 191 192 - (NSIndexPath *)indexPathForRowAtPoint:(CGPoint)point; // returns nil if point is outside of any row in the table 193 - (NSIndexPath *)indexPathForCell:(UITableViewCell *)cell; // returns nil if cell is not visible 194 - (NSArray *)indexPathsForRowsInRect:(CGRect)rect; // returns nil if rect not valid 195 196 - (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath; // returns nil if cell is not visible or index path is out of range 197 - (NSArray *)visibleCells; 198 - (NSArray *)indexPathsForVisibleRows; 199 - (UITableViewHeaderFooterView *)headerViewForSection:(NSInteger)section NS_AVAILABLE_IOS(6_0); 200 - (UITableViewHeaderFooterView *)footerViewForSection:(NSInteger)section NS_AVAILABLE_IOS(6_0); 201 202 - (void)scrollToRowAtIndexPath:(NSIndexPath *)indexPath atScrollPosition:(UITableViewScrollPosition)scrollPosition animated:(BOOL)animated; 203 - (void)scrollToNearestSelectedRowAtScrollPosition:(UITableViewScrollPosition)scrollPosition animated:(BOOL)animated; 204 205 // Row insertion/deletion/reloading. 206 207 - (void)beginUpdates; // allow multiple insert/delete of rows and sections to be animated simultaneously. Nestable 208 - (void)endUpdates; // only call insert/delete/reload calls or change the editing state inside an update block. otherwise things like row count, etc. may be invalid. 209 210 - (void)insertSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation; 211 - (void)deleteSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation; 212 - (void)reloadSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation NS_AVAILABLE_IOS(3_0); 213 - (void)moveSection:(NSInteger)section toSection:(NSInteger)newSection NS_AVAILABLE_IOS(5_0); 214 215 - (void)insertRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation; 216 - (void)deleteRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation; 217 - (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation NS_AVAILABLE_IOS(3_0); 218 - (void)moveRowAtIndexPath:(NSIndexPath *)indexPath toIndexPath:(NSIndexPath *)newIndexPath NS_AVAILABLE_IOS(5_0); 219 220 // Editing. When set, rows show insert/delete/reorder controls based on data source queries 221 222 @property (nonatomic, getter=isEditing) BOOL editing; // default is NO. setting is not animated. 223 - (void)setEditing:(BOOL)editing animated:(BOOL)animated; 224 225 @property (nonatomic) BOOL allowsSelection NS_AVAILABLE_IOS(3_0); // default is YES. Controls whether rows can be selected when not in editing mode 226 @property (nonatomic) BOOL allowsSelectionDuringEditing; // default is NO. Controls whether rows can be selected when in editing mode 227 @property (nonatomic) BOOL allowsMultipleSelection NS_AVAILABLE_IOS(5_0); // default is NO. Controls whether multiple rows can be selected simultaneously 228 @property (nonatomic) BOOL allowsMultipleSelectionDuringEditing NS_AVAILABLE_IOS(5_0); // default is NO. Controls whether multiple rows can be selected simultaneously in editing mode 229 230 // Selection 231 232 - (NSIndexPath *)indexPathForSelectedRow; // returns nil or index path representing section and row of selection. 233 - (NSArray *)indexPathsForSelectedRows NS_AVAILABLE_IOS(5_0); // returns nil or a set of index paths representing the sections and rows of the selection. 234 235 // Selects and deselects rows. These methods will not call the delegate methods (-tableView:willSelectRowAtIndexPath: or tableView:didSelectRowAtIndexPath:), nor will it send out a notification. 236 - (void)selectRowAtIndexPath:(NSIndexPath *)indexPath animated:(BOOL)animated scrollPosition:(UITableViewScrollPosition)scrollPosition; 237 - (void)deselectRowAtIndexPath:(NSIndexPath *)indexPath animated:(BOOL)animated; 238 239 // Appearance 240 241 @property (nonatomic) NSInteger sectionIndexMinimumDisplayRowCount; // show special section index list on right when row count reaches this value. default is 0 242 @property (nonatomic, retain) UIColor *sectionIndexColor NS_AVAILABLE_IOS(6_0) UI_APPEARANCE_SELECTOR; // color used for text of the section index 243 @property (nonatomic, retain) UIColor *sectionIndexBackgroundColor NS_AVAILABLE_IOS(7_0) UI_APPEARANCE_SELECTOR; // the background color of the section index while not being touched 244 @property (nonatomic, retain) UIColor *sectionIndexTrackingBackgroundColor NS_AVAILABLE_IOS(6_0) UI_APPEARANCE_SELECTOR; // the background color of the section index while it is being touched 245 246 @property (nonatomic) UITableViewCellSeparatorStyle separatorStyle; // default is UITableViewCellSeparatorStyleSingleLine 247 @property (nonatomic, retain) UIColor *separatorColor UI_APPEARANCE_SELECTOR; // default is the standard separator gray 248 @property (nonatomic, copy) UIVisualEffect *separatorEffect NS_AVAILABLE_IOS(8_0) UI_APPEARANCE_SELECTOR; // effect to apply to table separators 249 250 @property (nonatomic, retain) UIView *tableHeaderView; // accessory view for above row content. default is nil. not to be confused with section header 251 @property (nonatomic, retain) UIView *tableFooterView; // accessory view below content. default is nil. not to be confused with section footer 252 253 - (id)dequeueReusableCellWithIdentifier:(NSString *)identifier; // Used by the delegate to acquire an already allocated cell, in lieu of allocating a new one. 254 - (id)dequeueReusableCellWithIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(6_0); // newer dequeue method guarantees a cell is returned and resized properly, assuming identifier is registered 255 - (id)dequeueReusableHeaderFooterViewWithIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(6_0); // like dequeueReusableCellWithIdentifier:, but for headers/footers 256 257 // Beginning in iOS 6, clients can register a nib or class for each cell. 258 // If all reuse identifiers are registered, use the newer -dequeueReusableCellWithIdentifier:forIndexPath: to guarantee that a cell instance is returned. 259 // Instances returned from the new dequeue method will also be properly sized when they are returned. 260 - (void)registerNib:(UINib *)nib forCellReuseIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(5_0); 261 - (void)registerClass:(Class)cellClass forCellReuseIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(6_0); 262 263 - (void)registerNib:(UINib *)nib forHeaderFooterViewReuseIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(6_0); 264 - (void)registerClass:(Class)aClass forHeaderFooterViewReuseIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(6_0); 265 266 @end 267 268 //_______________________________________________________________________________________________________________ 269 // this protocol represents the data model object. as such, it supplies no information about appearance (including the cells) 270 271 @protocol UITableViewDataSource<NSObject> 272 273 @required 274 275 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section; 276 277 // Row display. Implementers should *always* try to reuse cells by setting each cell's reuseIdentifier and querying for available reusable cells with dequeueReusableCellWithIdentifier: 278 // Cell gets various attributes set automatically based on table (separators) and data source (accessory views, editing controls) 279 280 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath; 281 282 @optional 283 284 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView; // Default is 1 if not implemented 285 286 - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section; // fixed font style. use custom view (UILabel) if you want something different 287 - (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section; 288 289 // Editing 290 291 // Individual rows can opt out of having the -editing property set for them. If not implemented, all rows are assumed to be editable. 292 - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath; 293 294 // Moving/reordering 295 296 // Allows the reorder accessory view to optionally be shown for a particular row. By default, the reorder control will be shown only if the datasource implements -tableView:moveRowAtIndexPath:toIndexPath: 297 - (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath; 298 299 // Index 300 301 - (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView; // return list of section titles to display in section index view (e.g. "ABCD...Z#") 302 - (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index; // tell table which section corresponds to section title/index (e.g. "B",1)) 303 304 // Data manipulation - insert and delete support 305 306 // After a row has the minus or plus button invoked (based on the UITableViewCellEditingStyle for the cell), the dataSource must commit the change 307 // Not called for edit actions using UITableViewRowAction - the action's handler will be invoked instead 308 - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath; 309 310 // Data manipulation - reorder / moving support 311 312 - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath; 313 314 @end 315 316 //_______________________________________________________________________________________________________________ 317 318 // This category provides convenience methods to make it easier to use an NSIndexPath to represent a section and row 319 @interface NSIndexPath (UITableView) 320 321 + (NSIndexPath *)indexPathForRow:(NSInteger)row inSection:(NSInteger)section; 322 323 @property(nonatomic,readonly) NSInteger section; 324 @property(nonatomic,readonly) NSInteger row; 325 326 @end