UITableView使用總結(jié)和Cell的事件響應處理

先創(chuàng)建一個UITableViewCell的xib

CE2007D1-5850-4D6A-8EFA-B71675E17C78.jpg
#import "MyTableViewCell.h"
#import <UIKit/UIKit.h>
@interface MyTableViewCell : UITableViewCell

- (IBAction)clickMeBtn:(UIButton *)sender;

@property (copy, nonatomic) void(^touchClickButton)();

@end
#import "MyTableViewCell.h"
@implementation MyTableViewCell
- (void)awakeFromNib {
}
- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
    [super setSelected:selected animated:animated];
}
//定制UITableViewCell的事件響應處理
- (IBAction)clickMeBtn:(UIButton *)sender {
    if (self.touchClickButton) {
        self.touchClickButton();
    }
}

@end

對UITabeView基本用法的總結(jié)

#import "ViewController.h"

#import "MyTableViewCell.h"
@interface ViewController ()<UITableViewDelegate,UITableViewDataSource>

@property (nonatomic , strong) UITableView * tableView;
@property (nonatomic , assign) NSInteger  index;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    [self tableView];
}

#pragma mark - 設置cell分割線靠右

-(void)viewDidLayoutSubviews {
    if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) {
        [self.tableView setSeparatorInset:UIEdgeInsetsZero];
    }
    if ([self.tableView respondsToSelector:@selector(setLayoutMargins:)])  {
        [self.tableView setLayoutMargins:UIEdgeInsetsZero];
    }
}

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPat{
    if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
        [cell setLayoutMargins:UIEdgeInsetsZero];
    }
    if ([cell respondsToSelector:@selector(setSeparatorInset:)]){
        [cell setSeparatorInset:UIEdgeInsetsZero];
    }
}

#pragma mark - UITableViewDelegate

//section的header view 的高度。
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    return 64;
}

//section的footer view 的高度
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
    return 0.1;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
}

#pragma mark - UITableViewDataSource

//返回分區(qū)數(shù)(默認為1)
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
    return 2;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return 6;
}

//返回每個分區(qū)頭部的標題和尾部標題
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section;{
    return @"每個分區(qū)頭部的標題";
}

//設置自定義頭視圖和尾視圖--當然,我們可以通過self.tableView.tableHeaderView = [UIView alloc] init];這種方式來自定義headerView隶糕,但是這種方式會使tableView中所有的headerView都一樣尚揣,如果我們想讓每一組的headerView不一樣只能使用代理方法。
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section;{
    UIView * view = [[UIView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 20)];
    view.backgroundColor = [UIColor yellowColor];
    return view;
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    MyTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyTableViewCell" forIndexPath:indexPath];
    
    //cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;//顯示箭頭
    //cell.selectionStyle = UITableViewCellSelectionStyleNone;//點擊沒有效果

    //點擊cell里的button執(zhí)行的事件
    __weak typeof(self)weakSelf = self;
    [cell setTouchClickButton:^{
        weakSelf.index = indexPath.row;
        NSLog(@"你點擊的是第%ld",(long)weakSelf.index);
    }];
    
    return cell;
}

#pragma mark - lazyloading

- (UITableView *)tableView {
    if(_tableView == nil) {
        _tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStyleGrouped];
        _tableView.delegate = self;
        _tableView.dataSource = self;
        
        //設置cell的自適應高度
        _tableView.estimatedRowHeight = 44;//預計高度為44
        _tableView.rowHeight = UITableViewAutomaticDimension;//自適應高度
        
        //_tableView.separatorStyle = UITableViewCellSeparatorStyleNone;//不顯示分割線

        [_tableView registerNib:[UINib nibWithNibName:@"MyTableViewCell" bundle:nil] forCellReuseIdentifier:@"MyTableViewCell"];
        [self.view addSubview:_tableView];
    }
    return _tableView;
}

//實現(xiàn)右滑動刪除
//- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
//    return YES;
//}
//
//- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
//    
//    if (editingStyle == UITableViewCellEditingStyleDelete) {
//        [_array removeObjectAtIndex:indexPath.row];
//        [_tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
//        
//    }
//    else if (editingStyle == UITableViewCellEditingStyleInsert) {
//        // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view.
//    }
//}
//- (NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath
//{
//    return @"刪除";
//}
@end

在定制的UITableViewCell中催跪,如果需要對cell中的控件添加事件響應锁蠕,就要想辦法把cell的indexPath傳遞給響應函數(shù),在此總結(jié)了比較常用的代理方法懊蒸,希望對大家有幫助荣倾。

效果圖如下

C39EC701-435C-42DB-BEC2-2970EFA029D0.jpg

cell的高度返回

 UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath];
        return cell.frame.size.height;

加好約束后,然后告訴tableView自己去適應高度就可以了骑丸。有兩種寫法:

self.tableView.rowHeight = UITableViewAutomaticDimension;
self.tableView.estimatedRowHeight = 100;

但是如果我們用了自動計算高度的方法舌仍,又調(diào)用了tableView的reloadData方法(例如我們的數(shù)據(jù)有分頁的時候妒貌,加載完下一頁的數(shù)據(jù)后會去刷新tableView)。這時候就會出現(xiàn)問題铸豁,點擊狀態(tài)欄就有幾率不能精確滾動到頂部了:
解決這個問題的辦法是去緩存cell的高度灌曙,代碼如下:

@property (nonatomic, strong) NSMutableDictionary *heightAtIndexPath;//緩存高度所用字典

#pragma mark - UITableViewDelegate
-(CGFloat)tableView:(UITableView *)tableViewestimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSNumber *height = [self.heightAtIndexPathobjectForKey:indexPath];
    if(height)
    {
        return height.floatValue;
    }
    else
    {
        return 100;
    }
}
 
- (void)tableView:(UITableView *)tableViewwillDisplayCell:(UITableViewCell *)cellforRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSNumber *height = @(cell.frame.size.height);
    [self.heightAtIndexPathsetObject:heightforKey:indexPath];
}

解釋一下,就是用一個字典做容器节芥,在cell將要顯示的時候在字典中保存這行cell的高度在刺。然后在調(diào)用estimatedHeightForRowAtIndexPath方法時,先去字典查看有沒有緩存高度头镊,有就返回蚣驼,沒有就返回一個大概高度。

滾到最后一行

 [self.tableView scrollToRow:[_recordCollection count] - 1 inSection:0 atScrollPosition:UITableViewScrollPositionBottom animated:YES];

獲取當前cell

   NSIndexPath *indexpath=[NSIndexPath indexPathForRow:0 inSection:0];
            AddFriendsDefaultCell * cell = [self.tableView cellForRowAtIndexPath:indexpath];

ios - 原生骨架屏相艇,網(wǎng)絡加載過渡動畫的封裝https://www.tuicool.com/articles/eMnmU3B

優(yōu)化點1:cellForRowAtIndexPath

主要思路是減少cellForRowAtIndexPath 方法中的運算量颖杏,從以下方面檢查
1.1 加載圖片時,做異步處理坛芽,加載完成后再單獨更新cell留储,不要用reloadData刷新數(shù)據(jù)。
1.2 圖片有變換時咙轩,提前調(diào)整圖片尺寸获讳,并做緩存,刷新時直接取緩存圖片臭墨。
1.3 優(yōu)先使用CALayer繪制Cell赔嚎,避免繼承UITableViewCell,覆蓋drawRect胧弛,因為cell除了contentView外尤误,還有其他視圖,會導致疊加運算结缚。
1.4 復雜數(shù)據(jù)提前計算并緩存损晤。

優(yōu)化點2:heightForRowAtIndexPath

主要思路是減少高度的計算時間,有以下方法:
2.1 如果都是固定cell高度红竭,不要顯式實現(xiàn)代理 heightForRowAtIndexPath尤勋,使用 rowHeight屬性設置固定值。
2.2 非固定高度茵宪,提前計算并緩存最冰,刷新時直接取緩存高度值。
2.3 總是通過estimatedHeightForRowAtIndexPath 返回估計高度稀火,避免非顯示cell請求高度暖哨。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市凰狞,隨后出現(xiàn)的幾起案子篇裁,更是在濱河造成了極大的恐慌沛慢,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件达布,死亡現(xiàn)場離奇詭異团甲,居然都是意外死亡,警方通過查閱死者的電腦和手機黍聂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門躺苦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人产还,你說我怎么就攤上這事圾另。” “怎么了雕沉?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長去件。 經(jīng)常有香客問我坡椒,道長,這世上最難降的妖魔是什么尤溜? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任倔叼,我火速辦了婚禮,結(jié)果婚禮上宫莱,老公的妹妹穿的比我還像新娘丈攒。我一直安慰自己,他們只是感情好授霸,可當我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布巡验。 她就那樣靜靜地躺著,像睡著了一般碘耳。 火紅的嫁衣襯著肌膚如雪显设。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天辛辨,我揣著相機與錄音捕捂,去河邊找鬼。 笑死斗搞,一個胖子當著我的面吹牛指攒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播僻焚,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼允悦,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了溅呢?” 一聲冷哼從身側(cè)響起澡屡,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤猿挚,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后驶鹉,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绩蜻,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年室埋,在試婚紗的時候發(fā)現(xiàn)自己被綠了办绝。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡姚淆,死狀恐怖孕蝉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情腌逢,我是刑警寧澤降淮,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站搏讶,受9級特大地震影響佳鳖,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜媒惕,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一系吩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧妒蔚,春花似錦穿挨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至叁鉴,卻和暖如春土涝,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背幌墓。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工但壮, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人常侣。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓蜡饵,卻偏偏與公主長得像,于是被迫代替她去往敵國和親胳施。 傳聞我的和親對象是個殘疾皇子溯祸,可洞房花燭夜當晚...
    茶點故事閱讀 43,543評論 2 349

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