UI基礎控件- UITableView基本使用

UITableView

1.tableView常見屬性

  • rowHeight

    • cell的高度,如果不設置,默認就是44
  • sectionHeaderHeight

    • 每一組的頭部高度
  • sectionFooterHeight

    • 每一組的尾部高度
  • separatorColor

    • 設置分割線的顏色
    • 隱藏分割線可以設置顏色為clearColor
  • separatorStyle

    • 設置分割線樣式
      • SingleLine:默認,當行線
      • LineEtched:僅支持group樣式下
      • None: 隱藏分割線
  • tableHeadView

    • 整張表的頭部
  • tableFooterView

    • 整張表的尾部

2.UITableViewCell常見屬性

  • accessoryType
    • 設置cell右邊指示樣式
  • accessoryView
    • 設置cell右邊的控件
    • acessoryView的優先級大于accessoryType
  • selectionStyle
    • cell選中的樣式
    • 點擊cell相當于選中了cell
    • Blue/Gray/Default
    • 三個顯示的效果都是一樣的,都是灰色,ios6擬物化設計的時候有效果,現在扁平化沒有效果
    • None:看不到的透明色
  • backgroundColor
    • 設置cell的背景顏色
  • backgroundView
    • 背景控件
    • backgroundView的優先級大于backgroundColor
  • selectedBackgroundView
    • 選中cell的背景控件

3.展示數據

  • 設置數據源
    • 遵守<UITableViewDataSource>
    • 實現數據源方法
      • numberOfSectionsInTableView:
      • numberOfRowsInSection:
      • cellForRowAtIndexPath:
      • accessoryType
        • Checkmark:打鉤
        • DetailButton:詳情按鈕
        • DisclosureIndicator:箭頭
    • 設置tableView樣式group/Plain
    • 頭部標題:titleForHeaderInSection:
    • 尾部標題:titleForFooterInSection:

4.監聽cell點擊事件

- 設置代理屬性 self.tableView.delegate = self;
- 遵守<UITableViewDelegate>
- 實現代理方法:`didSelectRowAtIndexPath:`
- 當用戶點擊選中某一行cell的時候,就會自動調用這個方法
- didDeselectRowAtIndexPath:不常用,當用戶取消選中某一行的時候,調用這個方法
  • 常用的代理方法
    • viewForHeaderInSection:
      • 設置每一組的頭部控件
    • viewForFooterInSection:
      • 設置每一組的尾部控件
    • heightForHeaderInSection:
      • 每一組的頭部高度
      • 與sectionHeaderHeight區別
      • 代理方法更加靈活,可以根據參數,返回不同的高度
    • heightForFooterInSection:
      • 每一組的尾部高度
    • heightForRowAtIndexPath:
      • 返回每一行cell的高度
      • 和屬性rowHeight區別
      • 代理方法可以根據參數判斷,返回每一行具體的高度
    • cell顯示的高度由tableView決定,默認是44

二、UITableViewController

1.UITableViewController

  • 繼承UIViewController
  • 特點:
    • 控制器內部有一個tableView屬性,不需要再創建tableView
    • 默認遵守了代理和數據源協議
  • 自定義UITableViewController控制器
    • 繼承UITableViewController
    • 系統會默認寫好數據源和代理方法
    • 不需要設置數據源和代理,不需要遵守協議
    • 直接實現代理方法和數據源方法
    • 干掉系統的UIViewController
    • 添加UITableViewController,class設置為自定義的控制器
  • UITableViewController內部結構
    • 屬性:tableView強引用UITableView對象
    • 控制器內部的UITableView對象內部已經設置好數據源和代理就是當前控制器(弱引用)
    • 控制器默認遵守了兩個協議
    • tableView和控制器view指向同一個對象,控制器的view就是tableView

性能優化

  • UI卡頓原因
    • 性能問題
  • 蘋果內部創建cell的方式
    • 每當一個cell進入視野范圍內就會調用一次cellForRowAtIndexPath:這個方法
    • 只要用戶能夠看到cell,蘋果就會創建新的cell
    • 當cell要顯示的時候才去創建
    • 存在問題:重復創建cell
  • 性能優化:循環利用cell
    • 不直接創建cell,去緩存池中看有沒有可以直接利用的cell,如果緩存池中沒有,再創建新的cell
    • 優化步驟:
      • 1.首先去緩存池中看有沒有可以循環利用的cell
      • [dequeueReuseableCellWithIdentifier:綁定標識]返回一個cell給你
      • 2.如果緩存池中沒有可循環利用的cell,需要自己創建一個新的cell
      • if(cell == nil ){
        cell = [[UITableViewCell alloc]initWithStyle:reuseIndentifier:標識]
        }
- 重用標識的使用:
    - 重用標識要保持一致,可以定義一個變量保存這個標識 
        - NSString * ID = @"wine"
    - cellForRowAtIndexPath:調用頻繁,定義重用標識的局部變量用static修飾
    - 變量在內存中只調用一次 static 靜態局部變量:修改生命周期,一直在內存中,不改變作用域
    - 重用標識也可以定義成全局變量,但是不安全,容易被修改
  • 注意點:

    • cell背景顏色的設置,可以放到if判斷語句里
    • 每一個cell相同的設置,盡量寫在if(cell == nil)的大括號中
    • 怎么讓偶數行顯示箭頭,奇數行沒有箭頭?
      • 放到if語句括號后,不能放到if語句里
      • 設置數據的代碼也不可以放到if里
    • 不是都一樣的設置,要寫在if括號的外面
    • 循環引用有時會造成數據冗余的問題
      • 處理:有if就有else
  • tableView內部會自動把離開屏幕,創建過的cell放到緩存池中

2.注冊cell

  • 根據標識去緩存池中取,如果緩存池中沒有,希望tableView內部幫我們創建

    • [tableView registerClass:[UITableViewCell class]forCellReuseIdentifier:]
    • 根據標識,注冊cell的類型為UITableViewCell
    • dequeueReuseableCellWithIdentifier:會根據ID去緩存池中去取可循環利用的cell,如果沒有可循環利用的cell,會判斷有沒有根據這個標識注冊對應的cell類型,如果注冊了會自動創建這種類型的cell,并且綁定ID這個標識返回給我們。
    • if語句不用寫了
  • 注意點:

    • 注冊的代碼要寫在dequeueReuseableIdentifier:(去緩存池中取cell)之前
    • 只需要注冊一次
    • 注冊的方法可以寫在viewDidLoad方法里
    • viewDidLoad在控制器加載完畢還沒有顯示出來的時候只調用一次
    • 注冊cell存在問題:不能設置cell的樣式,detailTextLabel顯示不出來
  • 注冊cell使用場景

    • 自定義cell
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容