如何使用UITableview授霸,需要掌握幾個(gè)要點(diǎn)
遵守協(xié)議
tableview所屬的控制器必須遵守2個(gè)協(xié)議念赶,一是UITableViewDataSource
派继,數(shù)據(jù)源協(xié)議,二是UITableViewDelegate
狰右,有關(guān)代理的協(xié)議。同時(shí)舆床,必須設(shè)置數(shù)據(jù)源對象棋蚌、代理對象 。
數(shù)據(jù)源
datasource挨队,是一個(gè)屬性谷暮。任何oc類型的對象都可以成為它的數(shù)據(jù)源(必須遵守協(xié)議)。只有遵守協(xié)議才能使用自帶方法盛垦。需要數(shù)據(jù)源來展示數(shù)據(jù)湿弦,一般將tableview的數(shù)據(jù)源設(shè)為控制器本身。
方法
- 數(shù)據(jù)源方法
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
此方法告訴tableview需要設(shè)置多少個(gè)數(shù)據(jù)組腾夯。一般分為單組/多組數(shù)據(jù)颊埃,當(dāng)
return值為 1或沒有設(shè)置此方法時(shí),默認(rèn)組數(shù)為1蝶俱,即在tableview中只設(shè)置一個(gè)組班利;return值n大于等于1時(shí),表示在tableview中設(shè)置n個(gè)組跷乐。從0開始肥败,0表示第一組
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
此方法告訴tableview對應(yīng)的組有多少個(gè)數(shù)據(jù)行。需要對每組依次進(jìn)行設(shè)置次舌,return幾就表示幾行厢钧。
ps:當(dāng)tableview要展示數(shù)據(jù)時(shí),會自動(dòng)調(diào)用數(shù)據(jù)源方法
- 代理方法
主要作用是監(jiān)聽對tableview的點(diǎn)擊/選中事件机隙,主要包括以下幾個(gè)方法:
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
告訴tableview每一行顯示什么內(nèi)容—— 每一行都是一個(gè)UITableViewCell或其子類纽谒,故只需要返回一個(gè)cell即可证膨。其中的參數(shù)indexPath
indexPath.section 表示組(從0開始
indexPath.row 表示行(從0開始
另外,給cell添加數(shù)據(jù)也是在此方法體中添加鼓黔。
- 注冊
在viewDidLoad:方法中注冊央勒。要注冊什么類型的cell(自定義cell?)就在參數(shù)中給出類名澳化。
[self.mytableView registerClass:[ShopCell class] forCellReuseIdentifier:@"shopID"]
說明:使用注冊的方式創(chuàng)建的tableView崔步,只有textLabel一個(gè)屬性,如果還需要其他控件缎谷,就需要自定義cell井濒。
- 非注冊形式
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"reuse"];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"reuse"];
}
說明:以上是必要聲明的方法,缺一不可列林,這個(gè)過程是tableview展示數(shù)據(jù)的過程
- 其他常用方法:
返回選中的行號
NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
設(shè)置每一組的組頭標(biāo)題
-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
}
設(shè)置每一組的組尾標(biāo)題
-(NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section{
}
選中/點(diǎn)擊某行cell時(shí)會調(diào)用
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
//設(shè)置 取消點(diǎn)擊后選中cell
[tableView deselectRowAtIndexPath:indexPath animated:YES];
}
取消選中某行cell會調(diào)用 (當(dāng)我選中第0行的時(shí)候瑞你,如果現(xiàn)在要改為選中第1行 - >會先取消選中第0行,然后調(diào)用選中第1行的操作)
-(void)tableView:(nonnull UITableView *)tableView didDeselectRowAtIndexPath:(nonnull NSIndexPath *)indexPath
{
NSLog(@"取消選中 didDeselectRowAtIndexPath row = %ld ", indexPath.row);
}
數(shù)據(jù)源方法 cell左滑刪除希痴,并調(diào)用者甲,進(jìn)行事件處理(刪除)
-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{
[self.carArray removeObjectAtIndex:indexPath.row];
[self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationTop];
}
代理方法,返回左滑時(shí)砌创,返回右邊刪除按鈕的文字
-(NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath{
return @"刪除";
}
PS:以上兩個(gè)方法往往同時(shí)出現(xiàn)虏缸,實(shí)現(xiàn)左滑刪除。
添加自定義的左滑出現(xiàn)按鈕(會覆蓋掉上面兩個(gè)方法)
-(NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath{
//新建左滑出現(xiàn)的按鈕
UITableViewRowAction *actBtn1 = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"刪除" handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath) {
//點(diǎn)擊后做什么
}];
actBtn1.backgroundColor = [UIColor orangeColor];
UITableViewRowAction *actBtn2 = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"關(guān)注" handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath) {
//點(diǎn)擊后做什么
self.tableView.editing = NO; //向右退回按鈕(隱藏)
}];
return @[actBtn1,actBtn2]; //返回按鈕數(shù)組
}
常用屬性
- 對于整個(gè)tableview來說纺铭,包括
樣式(單組或多組)
UITableViewStylePlain
或UITableViewStyleGrouped
contentView
寇钉,每一行就是一個(gè)contentview
行高(所有行)rowHeight
滾動(dòng)條顏色indicatorStyle= UIScrollViewIndicatorStyleWhite;
分割線
-顏色separatorColor
設(shè)為clearColor相當(dāng)于取消系統(tǒng)分割線
-樣式separatorStyle
UITableViewCellSeparatorStyleNone,
UITableViewCellSeparatorStyleSingleLine,(默認(rèn))
UITableViewCellSeparatorStyleSingleLineEtched
頭部的view
背景色backgroundColor
進(jìn)入編輯狀態(tài)
self.tableView.editing = YES舶赔;
[self.tableView setEditing:YES animated:YES];
(帶動(dòng)畫)
編輯狀態(tài)下可多選
allowsMultipleSelectionDuringEditing = YES
當(dāng)前已選中的行的索引:indexPathForSelectedRows
- 對于組來說,包括
組頭標(biāo)題
組頭高sectionHeaderHeight
組尾標(biāo)題
組尾高sectionFooterHeight
- 對于行(即一個(gè)contentview)來說
包含以下3個(gè)是固有子控件
imageView谦秧、textLabel竟纳、detailTextLabel
右側(cè)視圖accessoryView
行高(某一行)
背景色backgroundColor
選中時(shí)的樣式selectionStyle
非編輯狀態(tài)下是否可以選中allowsSelection
(默認(rèn)YES)
是否可以選中多行allowsMultipleSelection
(默認(rèn)NO)
可選風(fēng)格:selectionStyle = UITableViewCellSelectionStyleDefault
拿到某行cell
PDtableViewCell *cell = [self.myTableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
右端提示
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
UITableviewCellStyle(創(chuàng)建時(shí)設(shè)置,initWithStyle:)
UITableViewCellStyleDefault,
UITableViewCellStyleValue1,
UITableViewCellStyleValue2,
UITableViewCellStyleSubtitle
數(shù)據(jù)
分為多組數(shù)據(jù)疚鲤、單組數(shù)據(jù)锥累。每一組包含若干行數(shù)據(jù)。
一般的做法是將數(shù)據(jù)獨(dú)立出來成為一個(gè)模型(數(shù)據(jù)類)集歇,然后從模型中引入數(shù)據(jù)桶略。
數(shù)據(jù)源方法補(bǔ)充
1. numberOfSectionsInTableView:------------設(shè)置表格的組數(shù)
2. tableView:numberOfRowInSection:--------設(shè)置每個(gè)組有多少行
3. tableView:cellForRowAtIndexPath:-------設(shè)置單元格顯示的內(nèi)容
4. tableView:titleForHeaderInSection:------設(shè)置組表的頭標(biāo)簽視圖
5. tableView:titleForFooterInSection:-------設(shè)置組表的尾標(biāo)簽視圖
6. tableView:canEditRowAtIndexPath:----設(shè)置單元格是否可以編輯
7. tableView:canMoveRowAtIndexPath:--設(shè)置單元格是否可以移動(dòng)
8. tableView:sectionIndexTitleForTableView:atIndex:-------設(shè)置指定組的表的頭標(biāo)簽文本
9. tableView:commitEditingStyle:forRowAtIndexPath:----------編輯單元格(添加,刪除)
10. tableView:moveRowAtIndexPath:toIndexPath-------單元格移動(dòng)
代理方法補(bǔ)充
1. tableView: willDisplayCell: forRowAtIndexPath:----------設(shè)置當(dāng)前的單元格
2. tableView: heightForRowAtIndexPath:---------設(shè)置每行的高度
3. tableView:tableView heightForHeaderInSection:-----------設(shè)置組表的頭標(biāo)簽高度
4. tableView:tableView heightForFooterInSection:-----------設(shè)置組表的尾標(biāo)簽高度
5. tableView: viewForHeaderInSection:----------自定義組表的頭標(biāo)簽視圖
6. tableView: viewForFooterInSection: ----------自定義組表的尾標(biāo)簽視圖
7. tableView: accessoryButtonTappedForRowWithIndexPath:-----------設(shè)置某個(gè)單元格上的右指向按鈕的響應(yīng)方法
8. tableView: willSelectRowAtIndexPath:---------獲取將要選擇的單元格的路徑
9. tableView: didSelectRowAtIndexPath:---------獲取選中的單元格的響應(yīng)事件
10.tableView: tableView willDeselectRowAtIndexPath:------------獲取將要未選中的單元格的路徑
11. tableView: didDeselectRowAtIndexPath:-----------獲取未選中的單元格響應(yīng)事件
12.tableView: willDisplayCell:--------------//當(dāng)cell將要顯示時(shí)調(diào)用
數(shù)據(jù)的刷新
只要修改、添加际歼、刪除模型惶翻,然后刷新數(shù)據(jù)即可。處理的對象是模型鹅心,只要模型中的數(shù)據(jù)變了吕粗,tableview的樣子就會改變。所以旭愧,修改模型才是本質(zhì)颅筋,不要采用直接拿到某行cell進(jìn)行刪除、添加cell输枯、改變cell的內(nèi)容的做法议泵。
全局
[self.myTableView reloadData]; (全局刷新,整個(gè)tableview的數(shù)據(jù)都重新刷新)
- 數(shù)據(jù)刷新桃熄,然后tableview就會重新調(diào)用數(shù)據(jù)源方法
局部
NSArray *indexPs = @[[NSIndexPath indexPathForRow:0 inSection:0]];
[self.myTableView reloadRowsAtIndexPaths:indexPs withRowAnimation:UITableViewRowAnimationMiddle];
只刷新某些行, indexPs指所要刷新的行 數(shù)組肢簿,指定某組某行。
注意:reloadRowsAtIndexPaths
方法使用前提是蜻拨,保證模型數(shù)組個(gè)數(shù)不變池充。因此,這個(gè)方法不適用于添加數(shù)據(jù)的情況缎讼。對于添加操作收夸,用insertRowsAtIndexPaths
方法,添加指定的行血崭。
NSArray *indexPs = @[[NSIndexPath indexPathForRow:0 inSection:0]];
[self.myTableView insertRowsAtIndexPaths:indexPs withRowAnimation:UITableViewRowAnimationLeft];
刪除操作后的刷新(帶動(dòng)畫)
//參數(shù)中指明所要?jiǎng)h除的行(數(shù)組)
[self.myTableView deleteRowsAtIndexPaths:卧惜。。夹纫。withRowAnimation:UITableViewRowAnimationAutomatic];
關(guān)于UITableviewCell
每一個(gè)cell包含3個(gè)子控件(屬性)咽瓷,即,ImageView舰讹,textlabel茅姜,detiltextlabel
。
創(chuàng)建:
UITableViewCell *cell = [[UITableViewCell alloc]init];//普通創(chuàng)建
UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:nil];//帶有detiltext