知識點:數組
1.UITableView使用app
2.UITableView分段功能ide
3.UITableViewCell重用機制優化
=======================動畫
UITableView使用atom
1.UITableView做用spa
2.UITableView建立代理
- (id)initWithFrame:(CGRect)frame style:(UITableViewStyle)style;code
UITableViewStyle:orm
UITableViewStylePlain 列表模式
UITableViewStyleGrouped 分組模式
// 實例化一個表格視圖
//UITableViewStylePlain 列表模式
//UITableViewStyleGrouped 分組模式
UITableView *tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStyleGrouped]; //設置代理 tableView.delegate = self; tableView.dataSource = self; [self.view addSubview:tableView];
3.UITableView關聯數據(上面)
1)tableView經過代理關聯數據
4.NSIndexPath
主要用來標識當前cell的在tableView中的位置
該對象有section和row兩個屬性,
前者標識當前cell處於第幾個section中
後者表明在該section中的第幾行
5.UITableViewCell介紹
1)建立方式
- (id)initWithStyle:(UITableViewCellStyle)style
reuseIdentifier:(NSString *)reuseIdentifier
//當某一個視圖控制器受到導航控制器管理的時候,若是在self.view之上添加的第一個子視圖是UIScrollView或者UIScrollView的子類,那麼這個對象的座標會自動往下偏移64個單位
//關閉此優化機制
//self.automaticallyAdjustsScrollViewInsets = NO;
UITableViewCellStyle:
UITableViewCellStyleDefault
UITableViewCellStyleValue1
UITableViewCellStyleValue2
UITableViewCellStyleSubtitle
UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];
=======================
UITableView分段功能
1.設置tableView的樣式
UITableViewStyleGrouped
2.設置代理
1)設置段數:默認返回1
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
=======================
UITableView經常使用方法
UITableViewDataSource
UITableViewDelegate
@interface RootViewController ()<UITableViewDelegate,UITableViewDataSource> #pragma mark- UITableViewDelegate&UITableViewDataSource //返回組數 (可選實現) -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{ return 2; }
//返回一組裏面有幾行(默認爲1組)
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return 20;
}
//每一行都須要返回一個UITableViewCell類型的對象
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
//NSIndexPath 表格視圖中的座標對象
// section->組
// row->行
//建立UITableViewCell類型的對象
/*
參數1:cell的類型
參數2:複用標識
*/
UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];
//設置cell的標題爲
cell.textLabel.text = @"你們好";
//設置圖片
cell.imageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"%03ld", indexPath.section * 20 + indexPath.row + 1]];
return cell;
}
1)設置行高
- (CGFloat)tableView:(UITableView *)tableView
heightForRowAtIndexPath:(NSIndexPath *)indexPath
//設置行高 -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ return 100; }
2)設置段頭標題
- (NSString *)tableView:(UITableView *)tableView
titleForHeaderInSection:(NSInteger)section
//返回組頭標題 -(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{ return [NSString stringWithFormat:@"第%ld組組頭",section]; }
3)設置段尾標題
- (NSString *)tableView:(UITableView *)tableView
titleForFooterInSection:(NSInteger)section
//返回組尾標題 -(NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section{ return @"我是組尾"; }
4)刪除/插入一行(兩個一塊兒用)
//編輯事件的回調方法 -(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{ if (editingStyle == UITableViewCellEditingStyleDelete) { //刪除 //首先刪除數據源 [self.dataArr removeObjectAtIndex:indexPath.row]; //刷新UI //reloadData 從新加載一遍數據 //[_tableView reloadData]; //帶動畫刷新(刪除) [_tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationRight]; }else{ //插入 //首先在數據源當中插入新數據 [self.dataArr insertObject:@"西安" atIndex:indexPath.row]; //刷新UI //[_tableView reloadData]; //帶動畫刷新(插入) [_tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationRight]; } } //返回的編輯類型 -(UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{ /* UITableViewCellEditingStyleDelete //刪除 UITableViewCellEditingStyleInsert //插入 */ //return UITableViewCellEditingStyleDelete; return UITableViewCellEditingStyleInsert; }
5)定製刪除上面的文字
- (NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath
//tableView調用
- (void)insertRowsAtIndexPaths:(NSArray *)indexPaths
withRowAnimation:(UITableViewRowAnimation)animation;
- (void)deleteRowsAtIndexPaths:(NSArray *)indexPaths
withRowAnimation:(UITableViewRowAnimation)animation;
6)進入編輯和取消編輯模式
@property(nonatomic,getter=isEditing) BOOL editing
7)如何讓指定行能夠編輯
- (BOOL)tableView:(UITableView *)tableView
canEditRowAtIndexPath:(NSIndexPath *)indexPath
//是否容許編輯 -(BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath{ //第一行不容許編輯例子 /* if (indexPath.row == 0) { return NO; } */ return YES; }
8)如何作索引
- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView
//返回索引 -(NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView{ NSMutableArray *newArr = [NSMutableArray new]; //注意:索引的數量應該跟組數相等,若是索引的數量大於組數,則剩餘的索引將無效 for (char i = 'A'; i <= 'Z'; i++) { [newArr addObject:[NSString stringWithFormat:@"%c組",i]]; } return newArr; }
9)如何跳轉到指定某一段某一行
- (void)scrollToRowAtIndexPath:(NSIndexPath *)indexPath
atScrollPosition:(UITableViewScrollPosition)scrollPosition
animated:(BOOL)animated;
10)如何移動一行
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)
sourceIndexPath toIndexPath: (NSIndexPath *)destinationIndexPath{
//移動某一行 -(void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath{ //sourceIndexPath 初始行數 //destinationIndexPath 目標行數 //保存一份 id obj = self.dataArr[sourceIndexPath.row]; //刪除 [self.dataArr removeObjectAtIndex:sourceIndexPath.row]; //插入到目標位置 [self.dataArr insertObject:obj atIndex:destinationIndexPath.row]; for (NSString *str in self.dataArr) { NSLog(@"str = %@",str); } }
11)選中指定行
- (void)tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath;
//選中某一行
//didSelectRowAtIndexPath 正確
//didDeselectRowAtIndexPath 錯誤
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ NSLog(@"選中的行數爲%ld",indexPath.row); /* UITableViewScrollPositionTop 移動某一行到屏幕的頂部 UITableViewScrollPositionMiddle 移動某一行到屏幕的中間 UITableViewScrollPositionBottom 移動某一行到屏幕的底部 */ [tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionMiddle animated:YES]; }
12)處理accessoryButton按下的事件
- (void)tableView:(UITableView *)tableView
accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath
=======================
UITableViewCell複用機制
1.cell重用方式
- (id)dequeueReusableCellWithIdentifier:(NSString *)identifier;
2.複用的問題
第一次dequeue的時候可能還不存在該cell,因此須要判斷
若是隊列中沒有該cell的話,則須要alloc一個
#pragma mark- UITableViewDelegate&UITableViewDataSource //返回一組裏面有幾行(默認爲1組) -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ return 20; } //每一行都須要返回一個UITableViewCell類型的對象 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ //在每個UITableView當中,都會擁有一個複用隊列(數組),每當須要返回一個UITableViewCell類型的對象的時候,首先去複用隊列裏面查找是否擁有相同類型的對象,若是有,就拿出來再次使用 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"]; //若是複用隊列當中沒有找到,就建立新對象 if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"]; } NSLog(@"修改前顯示的內容爲%@",cell.textLabel.text); //設置cell的標題爲 cell.textLabel.text = [NSString stringWithFormat:@"%ld行",indexPath.row + 1]; NSLog(@"修改後顯示的內容爲%@",cell.textLabel.text); return cell; }