2013-05-07 143 views
0

我爲我的應用程序創建一個設置視圖,並在該視圖中是一個UITableView。我正在創建自定義單元格來滿足我的需求,但是我遇到了問題 - 只有最後一個單元格獲得[layoutSubviews]。難道我做錯了什麼?自定義單元格,只有最後一個單元格獲取[layoutSubviews]?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    //int type = (indexPath.row == 0?1:0); 
    //if(indexPath.row == 6) type = 2; 

    NSLog(@"row %i created", indexPath.row); 
    TableCell *cell = [[TableCell alloc] initWithType:indexPath.row]; 

    cell.textLabel.text = @"Test cell"; 

    return cell; 
} 

在我的自定義單元格:

@implementation TableCell 

UIImageView *shadowView; 
int row; 

- (id) initWithType:(int)type { 
    row = type; 

    self = [super initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil]; 

    self.backgroundColor = [UIColor clearColor]; 
    self.backgroundView = [[UIView alloc] init]; 

    UIImage *shadowImage = [UIImage imageNamed:@"CellShadow"]; 
    shadowImage = [shadowImage resizableImageWithCapInsets:UIEdgeInsetsMake(14, 14, 14, 14)]; 

    shadowView = [[UIImageView alloc] initWithImage:shadowImage]; 

    [self.contentView addSubview:shadowView]; 
    //[self.contentView sendSubviewToBack:shadowView]; 

    NSLog(@"agreed, row %i created", row); 

    [self layoutSubviews]; 

    return self; 
} 

- (void) layoutSubviews { 
    NSLog(@"row: %i", row); 

    [super layoutSubviews]; 

    shadowView.frame = CGRectMake(
     0, 0, 
     self.contentView.frame.size.width, 
     self.contentView.frame.size.height 
    ); 
} 

@end 

不斷,只有最後一個單元格#6,據報道,當我旋轉,或當layoutSubviews應該叫。有什麼建議麼?

回答

0

這個問題是我自己糟糕的代碼。在這裏使用cell.backgroundView幫助了很多。

3

請勿直接撥打layoutSubviews。使用[self setNeedsLayout][self layoutIfNeeded]。但是不要在單元格的init方法中調用它們。

另外,不要調用[[TableCell alloc] initWithType:indexPath.row];直接,也可以。相反,使用...

- (id)dequeueReusableCellWithIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath

一旦你已經建立了電池,你可以告訴它,它的行,但要注意的是,細胞得到回收作爲表滾動,所以你必須在更新值每次致電cellForRowAtIndexPath

當調整表格視圖的大小時,單元格應該再次獲取佈局(不需要直接或間接調用任何調用)。

查看tableview doc here

+0

謝謝你的詳細解答。但即使使用[self setNeedsLayout],而不是直接調用layoutSubviews,只有最後一行在旋轉視圖時纔會獲取layoutSubviews。 – mattsven 2013-05-07 17:44:17

+0

我應該更仔細地閱讀你的代碼。 (佈局子視圖錯誤超過了我的注意力,這些應該肯定會被刪除)。我編輯了答案。首先獲得正確構建的單元格,佈局應該可以正常工作。如果沒有,在旋轉時嘗試tableView reloadData,但你不應該需要它。 – danh 2013-05-07 19:37:11

+0

我沒有使用可重複使用的單元格,因爲這將是一個設置視圖,並且它是少量的單元格。不管如何,它似乎都不起作用。 – mattsven 2013-05-07 22:12:45

0

你不應該直接調用layoutSubviews,它會在iOS準備好顯示時自動被iOS調用。你也應該像@danh推薦的那樣使單元出隊。如果你對這一切不是很滿意,那麼我真的建議你看看免費的Sensible TableView框架,它可以自動創建這些設置視圖(我真的在幾行中創建我的視圖)。

0

永遠不要自己調用layoutSubviews。當細胞中的子視圖的任何幀被改變時它將被調用。即使只是更改自定義單元格中的標籤文本也不會調用layoutSubviews。爲了獲得更好的性能,請使用單元重新使用。因爲它不會每次分配單元格。在你看來代碼看起來有很多內存問題,因爲分配的單元不會被釋放並且新的單元被創建。

+0

是的,我做了很多改變,因爲它允許分配和重用,並解決了這個問題。謝謝你的筆記! – mattsven 2013-05-12 08:00:18