UITableView基礎

什么是UITableView

  • 在眾多移動應用中,能看到各式各樣的列表數據
  • 在iOS中,要實現展示列表數據,最常用的做法就是使用UITableView
  • UITableView繼承自UIScrollView,因此支持垂直滾動,而且性能極佳

UITableView的兩種格式

  • UITableViewStylePlain


  • UISTableViewStyleGrouped


如何創建UITableView

  • 來點簡單粗暴的,直接在Xcode里面的storyboar里面拖出來,也可以根據需求拉個UITableViewController


  • 通過代碼
UITableView *myTableView = [UITableView alloc] init];

如何展示數據

  • UITableView需要一個數據源(dataSource)方法來顯示數據
  • UITableView會向dataSource查詢一共有幾組幾行以及每一行顯示什么數據
  • 沒有設置數據源的UITableView都只是空殼子
  • 凡是遵守UITableViewDataSource的OC對象,都可以是UITableView的數據源

tableView展示數據的過程

// 多少組數據
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;

// 每一組有多少行數據
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;

// 每一行顯示什么內容
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

  • tableView的常用設置
// 設置每一行cell的高度
self.tableView.rowHeight = 100;
// 設置每一組頭部的高度
self.tableView.sectionHeaderHeight = 50;
// 設置每一組尾部的高度
self.tableView.sectionFooterHeight = 50;
// 設置分割線顏色
self.tableView.separatorColor = [UIColor redColor];
// 設置分割線樣式
self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
// 設置表頭控件
self.tableView.tableHeaderView = [[UISwitch alloc] init];
// 設置表尾控件
self.tableView.tableFooterView = [UIButton buttonWithType:UIButtonTypeContactAdd];
// 設置右邊索引文字的顏色
self.tableView.sectionIndexColor = [UIColor redColor];
// 設置右邊索引文字的背景色
self.tableView.sectionIndexBackgroundColor = [UIColor blackColor];

cell的簡介

  • UITableView的每一行都是一個UITableViewCell
  • UITableViewCell內部有個默認的子視圖:contentView,contentView是UITableViewCell所顯示內容的父視圖,可以顯示一些輔助指示視圖,通過UITableViewCell的accessoryType來顯示:
typedef NS_ENUM(NSInteger, UITableViewCellAccessoryType) {
    UITableViewCellAccessoryNone,                                                      // don't show any accessory view
    UITableViewCellAccessoryDisclosureIndicator,                                       // regular chevron. doesn't track
    UITableViewCellAccessoryDetailDisclosureButton __TVOS_PROHIBITED,                 // info button w/ chevron. tracks
    UITableViewCellAccessoryCheckmark,                                                 // checkmark. doesn't track
    UITableViewCellAccessoryDetailButton NS_ENUM_AVAILABLE_IOS(7_0)  __TVOS_PROHIBITED // info button. tracks
};
  • contentView下默認有3個子視圖
  • 其中2個是UILabel(通過UITableViewCell的textLabel屬性和detailLabel屬性訪問)
  • 第3個是UIImageView(UITableViewcell.imageView);
  • UITableViewCell還有一個UITableViewCellStyle屬性,用于決定使用ContentView的哪些子視圖,以及子視圖在ContentView中的位置
  • 如下:


cell的重用原理

  • iOS設備的內存很有限,如果用UITableView展示成千上萬條數據就得創建成千上萬個UITableView對象的話,那將會耗盡iOS設備的內存.要解決這個問題,需要重用UITableView對象

  • 重用原理:


  • 當滾動列表時,部分UITableViewCell會移出窗口,UITableView會將窗口外的UITableViewCell放到一個對象池里,等待重用.當UITableView要求dataSource返回UITableViewCell時,dataSource會查看這個對象池,如果池中有未使用的UITableViewCell,dataSource會用新的數據配置這個UITableViewCell,然后返回給UITableView,重新顯示到窗口中,從而避免重復創建對象.

  • 有一個灰常嚴重的問題:

  • 有時候我們自定義一個UITableViewCell,每一行用的不一定是同一種的UITableViewCell,所以一個UITableView可以擁有不同種類的UITableViewCell,對象池中也會有很多不同類型的UITableViewCell,那么UITableView在重用UITableViewCell時可能會得到錯誤類型的UITableViewCell

  • 有一個很NB的解決方法(其實也不是很牛逼.入門了的人都會知道><)

  • UITableViewCell有一個NSString *reuseIdentifier屬性,可以在初始化UITableViewCell的時候傳入一個特定的字符串標示來設置reuseIdentifier(一般用UITableViewCell的類名).當UITableView要求dataSource返回UITableViewCell時,先通過一個字符串標識到對象池中查找對應類型的UITableViewCell,如果有,就重用.如果沒有,就傳入這個字符串標識來初始化一個UITableViewCell對象

  • 感覺用天朝的語言來描述好繞..直接寫個代碼好乏

  • 傳統寫法

/**
 *  每當有一個cell要進入視野范圍內,就會調用一次
 */
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // cell的標識
    static NSString *ID = @"wine";
    
    // 先去緩存池中查找可循環利用的cell
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
    
    // 如果緩存池中沒有可循環利用的cell
    if (!cell) {
        // 自己創建一個cell
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID]
   // 設置cell的屬性
     ...
    return cell;
    }
  • 新寫法 (注冊cell)
- (void)viewDidLoad {
    [super viewDidLoad];

    // 注冊某個重用標識 對應的 Cell類型
    [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:ID];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // 1.先去緩存池中查找可循環利用的cell,
   //  如果沒有的話,[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:ID]方法會我們創建

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
    
    // 2.設置數據
    ....

    return cell;
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,117評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,860評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,128評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,291評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,025評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,421評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,477評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,642評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,177評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,970評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,157評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,717評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,410評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,821評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,053評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,896評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,157評論 2 375

推薦閱讀更多精彩內容