2012-08-24 40 views
0

試圖隱藏和自定義靜態單元格的高度。我知道這可能不是最好的辦法。如果有人知道更好的方法,請諮詢。如何獲取在tableView靜態單元的故事板中設置的預設高度?

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

    if (![Mode isEqualToString:@"HIDE"]) { 
     if (indexPath.row == 2) { 
      return 0.0; 
     } 
    } 

    return "DEFAUlT_HEIGHT"; 

} 

如何從故事板獲取默認高度?故事板中每個單元格的高度都不相同。無論如何要更好地定製它?提前致謝。

回答

1

看一看這個線程:Hide static cells

它談論編程隱藏靜態細胞。下面是接受的答案:

1.隱藏細胞

沒有辦法直接隱藏單元格。 UITableViewController是 提供靜態單元格的數據源,目前 無法告訴它「不提供單元格x」。所以我們必須提供我們的 自己的數據源,它以 的順序委託給UITableViewController來獲取靜態單元。

最簡單的方法是繼承UITableViewController,並覆蓋所有需要在隱藏單元格時行爲不同的方法 。

在最簡單的情況下(單節表中,所有單元都具有相同 高度),這將是這樣的:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section  { 
    return [super tableView:tableView numberOfRowsInSection:section] - numberOfCellsHidden; } 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    // Recalculate indexPath based on hidden cells 
    indexPath = [self offsetIndexPath:indexPath]; 

    return [super tableView:tableView cellForRowAtIndexPath:indexPath]; } 

- (NSIndexPath*)offsetIndexPath:(NSIndexPath*)indexPath { 
    int offsetSection = indexPath.section; // Also offset section if you intend to hide whole sections 
    int numberOfCellsHiddenAbove = ... // Calculate how many cells are hidden above the given indexPath.row 
    int offsetRow = indexPath.row + numberOfCellsHiddenAbove; 

    return [NSIndexPathindexPathForRow:offsetRow inSection:offsetSection]; } 

如果您的表有多個部分,或 細胞有不同的高度,你需要重寫更多的方法。 同樣的原則適用於這裏:在委託給super之前,您需要抵消indexPath,部分 和row。

記住還保持,對於像 didSelectRowAtIndexPath方法方法indexPath參數:將用於相同小區不同, 取決於狀態(即隱藏單元的數量)。所以它是 可能是一個好主意,總是抵消任何indexPath參數,並使用這些值工作 。

2.動畫已經說明的變化

至於加雷,你會得到重大錯誤,如果你使用的動畫reloadSections 變化:withRowAnimation:方法。

我發現如果你打電話給reloadData:之後立刻, 動畫被大大改善(只剩下小毛病)。動畫後表格正確顯示爲 。

所以我在做什麼是:

- (void)changeState { 
    // Change state so cells are hidden/unhidden 
    ... 

    // Reload all sections 
    NSIndexSet* reloadSet = [NSIndexSetindexSetWithIndexesInRange:NSMakeRange(0, [self numberOfSectionsInTableView:tableView])]; 

    [tableView reloadSections:reloadSet withRowAnimation:UITableViewRowAnimationAutomatic]; 
    [tableView reloadData]; } 

如果這會有所幫助,請去那邊了投票henning77的答案。

相關問題