ios控件UITableview自己總結(jié)

如何使用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來說纺铭,包括

樣式(單組或多組)
UITableViewStylePlainUITableViewStyleGrouped
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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末月匣,一起剝皮案震驚了整個(gè)濱河市钻洒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌锄开,老刑警劉巖素标,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異萍悴,居然都是意外死亡头遭,警方通過查閱死者的電腦和手機(jī)寓免,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來计维,“玉大人袜香,你說我怎么就攤上這事∠砬保” “怎么了困鸥?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長剑按。 經(jīng)常有香客問我疾就,道長,這世上最難降的妖魔是什么艺蝴? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任猬腰,我火速辦了婚禮,結(jié)果婚禮上猜敢,老公的妹妹穿的比我還像新娘姑荷。我一直安慰自己,他們只是感情好缩擂,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布鼠冕。 她就那樣靜靜地躺著,像睡著了一般胯盯。 火紅的嫁衣襯著肌膚如雪懈费。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天博脑,我揣著相機(jī)與錄音憎乙,去河邊找鬼。 笑死叉趣,一個(gè)胖子當(dāng)著我的面吹牛泞边,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播疗杉,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼阵谚,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了乡数?” 一聲冷哼從身側(cè)響起椭蹄,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎净赴,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體罩润,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡玖翅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片金度。...
    茶點(diǎn)故事閱讀 37,997評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡应媚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出猜极,到底是詐尸還是另有隱情中姜,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布跟伏,位于F島的核電站丢胚,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏受扳。R本人自食惡果不足惜携龟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望勘高。 院中可真熱鬧峡蟋,春花似錦、人聲如沸华望。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赖舟。三九已至蓬戚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間建蹄,已是汗流浹背碌更。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留洞慎,地道東北人痛单。 一個(gè)月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像劲腿,于是被迫代替她去往敵國和親旭绒。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容