iOS之表視圖控制器UITableViewController

UITableView

表視圖

簡述:表視圖UITbaleView是iOS中最經常使用的的視圖,一般用來管理一組具備相同數據結構的數據。UITableView繼承自UIScrollView,能夠滾動,視圖中每一條數據都是顯示在UITableViewCell對象中的,表視圖能夠分區顯示數據,每一個分區稱爲一個section,每一行稱爲row,編號從0開始.

(1)建立web

UITableView *tableView = [UITableView alloc]initWithframe:
style:
style有兩種形式:
(1)UITableViewStyleplain  分區之間有間隔
(2)UITableViewStyleGrouped   分區之間沒有間隔條

(2)基本屬性數據結構

分割線樣式:separatorStyle
分割線顏色:separetouColor
行高    :rowHeight

(3)數據源DataSource 須要給tableView指定一個數據源,能夠給tableView提供數據,首先遵照協議,實現協議裏面必須實現的兩個方法:ide

每個分區的單元格數:
- (NSInteger)tableView:(UITableView *)tableview
    numberOfRowsInSection:(NSIndexPath *)indexPath
加載單元格:
-(UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath:)indexPath;

(4)cell 分區每個單元格稱爲cell,系統提供了4種style的cell(UITAbleViewCellStyle...),不一樣的樣式在包含的控件佈局略有不一樣 (5)表頭,表尾函數

能夠給表頭tableview.tableHeaderView ,表尾
tableview.tableFootview自定義視圖。
注意⚠!!!表頭,表尾不能爲同一對象

(6)設置分區數佈局

-(NSInteger)numberOfSectionsInTableView:(UITableView *)
tablview//默認返回值是1

(7)設置分區標題spa

-(NSString *)tableView:(UITableView *)tableview 
titleForheaderInSection:(NSInteger)section

(8)設置分區索引code

-(NSArray *)sectionIndexTitleForTableview:(UITableView *)tableview

tableView重用機制

UITableView靠mutableSet來實現重用功能的,出屏幕的cell會被添加到mutableSet中,進去屏幕的cell, 先從set中獲取,若是獲取不到,才建立一個cell,在cell顯示以前,給cell賦上相應的內容。對象

體如今cell(單元格)的加載繼承

-(UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static *identifier = @"cell";
     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];//從個重用隊列裏面取
     if (cell == nil) {//若是取出來爲空則從新建立
    cell = [[UITableViewCell alloc]
initWithStyle:UITableViewCellStyleDefault 
reuseIdentifier:identifier];
}
return cell;
}

UITableView編輯

增刪

(1)設置tablView處於可編輯狀態索引

-(void)setEditing:(BOOL)editing animated:(BOOL)animated

(2)設置哪些行能夠被編輯

-(BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath

(3)返回編輯樣式

-(UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath

(4)增刪操做

-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
[tableView beginupdates];開始編輯
if(editingStyle== UITableViewCellEditingStyleDelete)
{
    刪除操做
}else
{
    增價操做
}
[tableView endupdates];結束編輯

移動

(1)讓tableView處於可編輯狀態

(2)指定幾區幾行可被移動

-(void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath

(3)當出現越區移動時候觸發

- (NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath

被選中的時候觸發

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

表視圖控制器

UITableViewController

新建的UITableViewController只是簡單的把上面的函數自動生成,不用咱們一個一個去找,並且它的self.view是一個UITableView類型的,因此不用再新建UITableView,默認容許編輯。編輯樣式默認是所有刪除

自定義cell

自定義cell就是建立一個UITableViewCell子類,將cell上的控件建立都封裝在子類中

!!! 子視圖控件添加到cell的contentView上 main

如何通訊?

cell中聲明一個Model類型的屬性,viewController中獲取到Model對象後賦值給cell的Model屬性,

cell中重寫Model的setter方法,把Model對象中的內容從新賦值給各個控件。(M和V不直接通訊,C負責M和V之間進行通訊)

好比:student是一個model,也是自定義cell裏面中的一個變量,在viewController裏面獲取到model對象賦值給cell的Model屬性,則會進行下邊的操做

-(void)setStudent:(Student *)student
{
if (_student != student) {
    [_student release];
    _student = [student retain];
    //        同時給內部控件賦值
    _nameLabel.text = student.name;
    _phoneNumberLabel.text = student.phoneNumber;
    _sexLabel.text = student.sex;
    _introduceLabel.text = student.introduce;
    _iconView.image = [UIImage imageNamed:student.icon];
    //        改變iconView的高度,
    CGRect rec = _introduceLabel.frame;
    rec = CGRectMake(rec.origin.x, rec.origin.y, rec.size.width, [BoyTableViewCell heightForString:student.introduce ]);
    _introduceLabel.frame = rec;
}
}

多種cell混合使用

在開發中比較常見一個tableView裏面有多種不一樣佈局樣式的cell,所以多種類型的cell混合在一個tableView中使用的狀況非常常見。因此常常自定義多種不一樣類型的cell。

注意事項

一般咱們在tableView :cellForRowAtIndexPath:方法中根據不一樣的Model來決定使用什麼類型的cell,每種類型的cell要定義不一樣的重用標識符以存儲在不一樣的重用隊列中。這樣cell重用的時候會根據重用標識從重用隊列中取出哪一種類型的cell

cell自適應高度

tableView:heightForRowAtindexPath:方法要比tableView:cellForRowAtIndexPath先執行,因此應該提早計算好每行cell須要多少高度

相關文章
相關標籤/搜索