iOS開發-UI (八)TableView,-uitableview
知識點:
1.UITableView使用
2.UITableView分段功能
3.UITableViewCell重用機制
=======================
UITableView使用
1.UITableView作用
2.UITableView建立
- (id)initWithFrame:(CGRect)frame style:(UITableViewStyle)style;
UITableViewStyle:
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;}