亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

UITableView快速入門

2019-11-14 18:47:41
字體:
來源:轉載
供稿:網友

?# UITableViewDatasource

設置數據源

  • 設置數據源的對象必須遵守UITableViewDatasource協議
self.tableView.dataSource = self;

必須實現的數據源方法

@required// 設置每一組有多少行- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;// 設置每一個cell顯示什么,長什么樣子// 什么時候調用:每當有一個cell進入視野范圍內就會調用- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

其它數據源方法

@optional// 設置有多少組,如果實現此方法,默認返回組數為1- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;// 設置第section組的頭部顯示的string- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section;// 設置第section組的尾部顯示的string- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section;// Editing// Individual rows can opt out of having the -editing PRoperty set for them. If not implemented, all rows are assumed to be editable.// 設置每一組是否有可編輯的能力。如果不實現,所有的row假定是可編輯的- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath;// 其它的直接點進頭文件看...

UITableViewDelegate

設置代理

  • 設置的代理對象必須遵守UITableViewDelegate協議
self.tableView.delegate = self;

常見代理方法

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section;- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section;// custom view for header. will be adjusted to default or specified header height- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section;// custom view for footer. will be adjusted to default or specified footer height- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section;// Called after the user changes the selection.- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;...

Cell的循環利用方式1

/** *  什么時候調用:每當有一個cell進入視野范圍內就會調用 */- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{    // 0.重用標識    // 被static修飾的局部變量:只會初始化一次,在整個程序運行過程中,只有一份內存    static NSString *ID = @"cell";    // 1.先根據cell的標識去緩存池中查找可循環利用的cell    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];    // 2.如果cell為nil(緩存池找不到對應的cell)    if (cell == nil) {        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID];    }    // 3.覆蓋數據    cell.textLabel.text = [NSString stringWithFormat:@"testdata - %zd", indexPath.row];    return cell;}

Cell的循環利用方式2

  • 定義一個全局變量
// 定義重用標識NSString *ID = @"cell";
  • 注冊某個標識對應的cell類型
// 在這個方法中注冊cell- (void)viewDidLoad {    [super viewDidLoad];    // 注冊某個標識對應的cell類型    [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:ID];}
  • 在數據源方法中返回cell
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{    // 1.去緩存池中查找cell    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];    // 2.覆蓋數據    cell.textLabel.text = [NSString stringWithFormat:@"testdata - %zd", indexPath.row];    return cell;}

Cell的循環利用方式3

  • 在storyboard中設置UITableView的Dynamic Prototypes Cell

  • 設置cell的重用標識

  • 在代碼中利用重用標識獲取cell

// 0.重用標識// 被static修飾的局部變量:只會初始化一次,在整個程序運行過程中,只有一份內存static NSString *ID = @"cell";// 1.先根據cell的標識去緩存池中查找可循環利用的cellUITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];// 2.覆蓋數據cell.textLabel.text = [NSString stringWithFormat:@"cell - %zd", indexPath.row];return cell;

自定義cell

  • 等高的cell

    • storyboard自定義cell

      • 1.創建一個繼承自UITableViewCell的子類,比如SLDealCell


      • 2.在storyboard中

        • 往cell里面增加需要用到的子控件


        • 設置cell的重用標識


        • 設置cell的class為SLDealCell


      • 3.在控制器中

        • 利用重用標識找到cell
        • 給cell傳遞模型數據


      • 4.在SLDealCell中

        • 將storyboard中的子控件連線到類擴展中


        • 需要提供一個模型屬性,重寫模型的set方法,在這個方法中設置模型數據到子控件上


    • xib自定義cell

      • 1.創建一個繼承自UITableViewCell的子類,比如SLDealCell

      • 2.創建一個xib文件(文件名建議跟cell的類名一樣),比如SLDealCell.xib

        • 拖拽一個UITableViewCell出來
        • 修改cell的class為SLDealCell
        • 設置cell的重用標識
        • 往cell中添加需要用到的子控件
      • 3.在控制器中

        • 利用registerNib...方法注冊xib文件
        • 利用重用標識找到cell(如果沒有注冊xib文件,就需要手動去加載xib文件)
        • 給cell傳遞模型數據

      • 4.在SLDealCell中

        • 將xib中的子控件連線到類擴展中
        • 需要提供一個模型屬性,重寫模型的set方法,在這個方法中設置模型數據到子控件上
        • 也可以將創建獲得cell的代碼封裝起來(比如cellWithTableView:方法)
    • 代碼自定義cell(使用frame)

      • 1.創建一個繼承自UITableViewCell的子類,比如SLDealCell

        • 在initWithStyle:reuseIdentifier:方法中

          • 添加子控件
          • 設置子控件的初始化屬性(比如文字顏色、字體
        • 在layoutSubviews方法中設置子控件的frame
        • 需要提供一個模型屬性,重寫模型的set方法,在這個方法中設置模型數據到子控件
      • 2.在控制器中

        • 利用registerClass...方法注冊SLDealCell類
        • 利用重用標識找到cell(如果沒有注冊類,就需要手動創建cell)
        • 給cell傳遞模型數據
        • 也可以將創建獲得cell的代碼封裝起來(比如cellWithTableView:方法)
    • 代碼自定義cell(使用autolayout)

      • 1.創建一個繼承自UITableViewCell的子類,比如SLDealCell

        • 在initWithStyle:reuseIdentifier:方法中

          • 添加子控件
          • 添加子控件的約束(建議使用Masonry
          • 設置子控件的初始化屬性(比如文字顏色、字體)
        • 需要提供一個模型屬性,重寫模型的set方法,在這個方法中設置模型數據到子控件
      • 2.在控制器中

        • 利用registerClass...方法注冊SLDealCell類
        • 利用重用標識找到cell(如果沒有注冊類,就需要手動創建cell)
        • 給cell傳遞模型數據
        • 也可以將創建獲得cell的代碼封裝起來(比如cellWithTableView:方法)

UITableViewCell的常見設置

// 取消選中的樣式cell.selectionStyle = UITableViewCellSelectionStyleNone;// 設置選中的背景色UIView *selectedBackgroundView = [[UIView alloc] init];selectedBackgroundView.backgroundColor = [UIColor redColor];cell.selectedBackgroundView = selectedBackgroundView;// 設置默認的背景色cell.backgroundColor = [UIColor blueColor];// 設置默認的背景色UIView *backgroundView = [[UIView alloc] init];backgroundView.backgroundColor = [UIColor greenColor];cell.backgroundView = backgroundView;// backgroundView的優先級 > backgroundColor// 設置指示器//    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;cell.accessoryView = [[UISwitch alloc] init];

強制刷新布局

[self layoutIfNeed];

方法調用順序

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{    NSLog(@"cellForRowAtIndexPath");    ...    return cell;}- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{    NSLog(@"%s", __func__);    return [self.statues[indexPath.row] cellHeigth];}
  • 打印結果就是調用順序
2015-06-05 19:23:41.159 08-微博-autolayout-xib[1209:325549]-[SLStatusTableViewController tableView:heightForRowAtIndexPath:]2015-06-05 19:23:41.159 08-微博-autolayout-xib[1209:325549]cellForRowAtIndexPath
  • 但是如果實現了tableView:estimatedHeightForRowAtIndexPath:方法的話,調用順序就會改變
2015-06-05 19:25:22.092 08-微博-autolayout-xib[1237:334971]-[SLStatusTableViewController tableView:estimatedHeightForRowAtIndexPath:]2015-06-05 19:25:22.092 08-微博-autolayout-xib[1237:334971]cellForRowAtIndexPath2015-06-05 19:25:22.111 08-微博-autolayout-xib[1237:334971]-[SLStatusTableViewController tableView:heightForRowAtIndexPath:]

自定義非等高CellHeight

  • xib自定義cell(重點)

    • 在模型中增加一個cellHeight屬性,用來存放對應cell的高度
    • 在cell的模型屬性set方法中調用[self layoutIfNeed]方法強制布局,然后計算出模型的cellheight屬性值
    • 在控制器中實現tableView:estimatedHeightForRowAtIndexPath:方法,返回一個估計高度,比如200
    • 在控制器中實現tableView:heightForRowAtIndexPath:方法,返回cell的真實高度(模型中的cellHeight屬性)
  • storyboard自定義cell
  • 代碼自定義cell(frame)
  • 代碼自定義cell(Autolayout)

UILable的寬度問題

  • 問題:代碼創建UILable的時候,設置numberOfLines = 0后,沒有效果。
  • 解決:在設置模型的代碼中,再設置numberOfLines這個屬性,在init方法和awakeFromNib中設置都沒用。因為那個時候還沒有設置UILable的內容,UILable不知道自己需要多高多寬。

  • 如果設置了lable的寬度,文字過多的時候,會報一個錯誤。
  • 解決:設置lable每一行文字的最大寬度

// 只執行一次此方法- (void)awakeFromNib{    // 設置label每一行文字的最大寬度    // 為了保證計算出來的數值 跟 真正顯示出來的效果 一致    self.contentLable.preferredMaxLayoutWidth = [UIScreen mainScreen].bounds.size.width - 20;}

keyboard

鍵盤彈出來時對視圖的處理

  • 監聽鍵盤的狀態改變
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardFrameCHange:) name:UIKeyboardWillChangeFrameNotification object:nil];
  • 處理方式1

    • transform
- (void)keyboardFrameCHange:(NSNotification *)notification{    CGFloat WH =   [UIScreen mainScreen].bounds.size.height;    CGRect rect =  [notification.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];    CGFloat time = [notification.userInfo[UIKeyboardAnimationDurationUserInfoKey] floatValue];// Y方向位移鍵盤的值== 鍵盤的高度[UIView animateWithDuration:time animations:^{    self.view.transform = CGAffineTransformMakeTranslation(0, rect.origin.y - WH);    }];}
  • 處理方式2

    • 約束
    • 取出最下方的底部控件的 對于 self.view的最底部約束(Vertical Space - View - View)
- (void)keyboardFrameCHange:(NSNotification *)notification{    CGFloat WH =   [UIScreen mainScreen].bounds.size.height;    CGRect rect =  [notification.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];    CGFloat time = [notification.userInfo[UIKeyboardAnimationDurationUserInfoKey] floatValue];    // 如果等于鍵盤的y值等于當前的屏幕高度,則表示鍵盤縮回去了    // 反之,則說明鍵盤出來了    // 可以把下面的代碼加入動畫中    if(rect.origin.y != WH)    {        self.bottomSpace.constant = rect.size.height;    }else self.bottomSpace.constant = 0;    [UIView animateWithDuration:time animations:^{        [self.view layoutIfNeeded];    }];}

上一篇:ios濾鏡

下一篇:九宮格的算法

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美极品少妇xxxxⅹ裸体艺术| 欧美日韩精品在线播放| 国产成人97精品免费看片| 久久久久久久一区二区| 亚洲自拍偷拍在线| 在线观看中文字幕亚洲| 欧美日韩在线影院| 久久久久久久久久久成人| 色综合色综合久久综合频道88| 色偷偷88888欧美精品久久久| 国产精品最新在线观看| 亚洲人成免费电影| 久久99精品久久久久久青青91| 久久久天堂国产精品女人| 欧美高清电影在线看| 97超级碰碰人国产在线观看| 午夜精品久久久久久久久久久久| 91免费精品视频| 狠狠色香婷婷久久亚洲精品| 欧美性jizz18性欧美| 黑人巨大精品欧美一区二区| 亚洲欧洲偷拍精品| 国产精品日韩在线| 成人xvideos免费视频| 国产极品jizzhd欧美| 久久免费精品日本久久中文字幕| 成人免费黄色网| 国产精品久久激情| 亚洲大胆人体av| 久久伊人精品一区二区三区| 亚洲精品国产suv| 国产精品高潮呻吟久久av野狼| 日韩精品福利在线| 色偷偷av一区二区三区乱| 国内成人精品视频| 久久精品欧美视频| 国产精品入口夜色视频大尺度| 久久久久五月天| 日韩成人在线播放| 亚洲一区二区三区视频播放| 日韩精品有码在线观看| 成人高h视频在线| 亚洲天堂第一页| 中文.日本.精品| 欧美天天综合色影久久精品| 亚洲人成网在线播放| 成人免费福利视频| 亚洲激情自拍图| 国产精品久久久久久搜索| 久久久精品一区| 成人精品网站在线观看| 北条麻妃久久精品| 亚洲成人网在线| 亚洲人成伊人成综合网久久久| 久久国产一区二区三区| 在线精品国产成人综合| 亚洲国产私拍精品国模在线观看| 91精品国产电影| 国产欧美一区二区三区四区| 欧美在线视频观看免费网站| 久久久亚洲国产天美传媒修理工| 亚洲精品国产综合久久| 91精品国产综合久久香蕉的用户体验| 青青久久av北条麻妃黑人| 欧美日韩精品在线观看| 日韩二区三区在线| 久久久亚洲成人| 精品无人区太爽高潮在线播放| 91久久精品视频| 欧美日韩国产黄| 精品国产一区二区在线| 日韩大片免费观看视频播放| 日韩欧美在线视频日韩欧美在线视频| 欧美精品video| 91精品久久久久久综合乱菊| 欧美激情国产高清| 国产91ⅴ在线精品免费观看| 两个人的视频www国产精品| 国产在线a不卡| www.99久久热国产日韩欧美.com| 精品亚洲一区二区三区| 日韩在线视频线视频免费网站| 欧美日韩一区二区免费视频| 成人福利网站在线观看| 亚洲日本成人网| 97人人做人人爱| 韩国19禁主播vip福利视频| 日韩禁在线播放| 国产99久久精品一区二区 夜夜躁日日躁| 色综合久久88| 日韩欧美在线视频免费观看| 午夜精品视频在线| 国产精品久久久久久久久久久不卡| 日本亚洲欧洲色α| 亚洲国产精品久久久久秋霞不卡| 国产精品羞羞答答| 精品久久久一区二区| 亚洲一区二区中文| 亚洲国产成人精品久久久国产成人一区| 日韩精品在线免费观看视频| 中文字幕国产亚洲2019| 精品动漫一区二区三区| 欧美黄色成人网| 欧美一二三视频| 欧美一级片一区| 久久免费视频在线观看| 国产精品免费一区二区三区都可以| 精品久久久久久久久久ntr影视| 亚洲国产精品久久久久久| 欧美激情第99页| 欧美大片在线免费观看| 欧美日韩中文字幕日韩欧美| 都市激情亚洲色图| 在线播放日韩精品| 在线观看久久av| 国产精品嫩草影院久久久| 日韩av大片在线| 曰本色欧美视频在线| 精品伊人久久97| 日本精品性网站在线观看| 亚洲天堂免费视频| 国产欧美日韩精品在线观看| 欧美激情一区二区三区在线视频观看| 狠狠色狠狠色综合日日五| 国内精品免费午夜毛片| 亚洲第一网站免费视频| 日韩久久午夜影院| 岛国av在线不卡| 久久精品国产69国产精品亚洲| 国产精品美女久久久久久免费| 国产精品欧美日韩久久| 亚洲经典中文字幕| 国产成人福利夜色影视| 欧美另类xxx| 成人免费黄色网| 日韩av在线影院| 国产精品一区二区女厕厕| 亚洲区中文字幕| 久久久成人精品视频| 4438全国亚洲精品在线观看视频| 91精品国产91久久久久久最新| 欧美高清视频一区二区| xx视频.9999.com| wwwwwwww亚洲| 日韩大片免费观看视频播放| 狠狠色狠狠色综合日日小说| 日韩av免费看| 欧美大片免费观看在线观看网站推荐| 中文字幕亚洲欧美日韩在线不卡| 国产精品久久久久久久午夜| 欧美成人午夜影院| 欧美国产日韩一区| 久久亚洲国产精品成人av秋霞| 亚洲国内高清视频| 亚洲视频视频在线| 亚洲自拍偷拍在线| 亚洲福利视频在线| 亚洲最大福利网| 国产不卡av在线免费观看| 中文字幕亚洲图片| 久久视频在线看| 亚洲欧美国产日韩中文字幕| 久久久久久久久网站| 欧美大片在线看免费观看|