2013-07-12 71 views
9

我需要混合靜態和動態部分的一個分組UITableView一個類似於Twitter的賬戶設置應用程序:在分組表視圖

Twitter accounts

也就是說,一種形式或菜單,其中一些的這些部分有一組事先已知的靜態單元格,其他部分必須是動態的,並允許以「添加帳戶」的方式插入其他行。我在.xib文件中管理UITableView。對於靜態的細胞,我已分離.xib文件,我可以在視圖控制器的cellForRowAtIndexPath:方法內加載。

我應該如何處理這種類型的表?我沒有找到任何示例代碼。

如何cellForRowAtIndexPath:方法應該是什麼樣子?我需要爲靜態單元格保留strong屬性嗎?在表格視圖所在的同一個.xib文件中直接設計每個靜態單元併爲它們設置出口是否更好? (雖然這不允許重複使用我的自定義設計的細胞......)

我需要爲實現這一目標,正確地管理細胞和記憶的一些準則。在此先感謝

+0

我不認爲你可以混合靜態單元格和動態單元格 - 它是表格視圖本身的屬性,所以我認爲它需要是一個或另一個。動態單元無法做到,您可以使用靜態單元完成動態單元,因此請將其全部變爲動態。 – rdelmar

+0

@rdelmar好吧,也許我用錯誤的方式命名事情......我想用「靜態」和「動態」來表示的意思就是我有一組部分,其細胞我已經知道並且不會改變(作爲Twitter徽標單元格和屏幕截圖中的「更新聯繫人」單元格)以及另一組將在用戶提供新信息(如「添加帳戶」)時具有可變單元集的部分集合 – AppsDev

+0

@rdelmar由於存在我需要的例子(例如,我提供的屏幕截圖以及電話應用程序中的「新聯繫人」功能),可以做...問題是,怎麼做?我不使用故事板... – AppsDev

回答

27

如果您只是在cellForRowAtIndexPath中未添加任何內容而返回單元格,則動態原型單元格可以像靜態單元格那樣工作,因此您可以同時擁有「靜態」單元格和動態單元格(其中行數和內容可變)通過使用動態原型。

在下面的例子中,我從IB(具有分組表格視圖)開始,並將動態原型單元格的數量更改爲3.我將第一個單元格的大小調整爲80,然後添加一個UIImageView和兩個標籤。中間單元格是基本樣式單元格,最後一個是具有單個居中標籤的另一個自定義單元格。我給他們每個人自己的標識符。這就是它看起來像在IB:

enter image description here

然後在代碼中,我這樣做:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.theData = @[@"One",@"Two",@"Three",@"Four",@"Five"]; 
    [self.tableView reloadData]; 
} 

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    return 3; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    if (section == 1) 
     return self.theData.count; 
    return 1; 
} 

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
    if (indexPath.section == 0) 
     return 80; 
    return 44; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    UITableViewCell *cell; 

    if (indexPath.section == 0) { 
     cell = [tableView dequeueReusableCellWithIdentifier:@"TitleCell" forIndexPath:indexPath]; 

    }else if (indexPath.section == 1) { 
     cell = [tableView dequeueReusableCellWithIdentifier:@"DataCell" forIndexPath:indexPath]; 
     cell.textLabel.text = self.theData[indexPath.row]; 

    }else if (indexPath.section == 2) { 
     cell = [tableView dequeueReusableCellWithIdentifier:@"ButtonCell" forIndexPath:indexPath]; 
    } 

    return cell; 
} 

正如你可以看到,對於「靜態像」細胞,我只返回具有正確標識符的單元格,並且我得到了我在IB中設置的內容。運行時的結果將看起來像您的發佈圖像與三個部分。

+0

感謝您的解釋和代碼片段。如果不是將單元格作爲IB中的出口,而是從他們自己的'xib'文件中加載它們(爲了能夠在其他表格中重用單元格自定義樣式),cellForRowAtIndexPath:方法應該如何?我需要將單元格鏈接到強屬性? – AppsDev

+1

@AppsDev,它看起來沒什麼不同。你只需要在viewDidLoad中註冊nib。因此,對於每種類型的單元格,您需要編寫如下內容:[self.tableView registerNib:[UINib nibWithNibName:@「YourNibNameHere」bundle:nil] forCellReuseIdentifier:@「TitleCell」];你不需要任何屬性。 – rdelmar

+0

謝謝!然後,如果我想訪問我的自定義單元格(我有文本字段和開關)內的控件,根據需要查找表格中的單元格,而不是保留每個單元格的引用會更好嗎? – AppsDev

2

靜態只是對動態佈局的頂部的規定。基本上靜態是一個所見即所得的。

如果你是不防水與值進行試驗,我建議去動態。有數百個示例可用,例如thisthis

當你走的更遠,你會看到自己發散走向兩個選項自定義動態表視圖時:

  • 子類UITableViewCell(更多的努力,但是從長遠來看好)。再次按照this
  • 播放與UITableViewCell屬性內cellForRowAtIndexPath:(較少的努力和速效性,但可以是或者可以不是性能友好由於可能的再拉深)

可能性是無窮的,如here其中細胞背景視圖被定製。