2013-02-01 18 views
9

Khi nào chính xác layoutSubviews được gọi trên tùy chỉnh UITableViewCell trong phương thức UITableViewCellscellForRowAtIndexPath? Dưới đây, tôi cần layoutSubviews để được gọi SAU KHI tôi đặt thuộc tính FiltersTableViewCellItem. Tôi có thiết lập chính xác không? Tôi muốn có thể sử dụng layoutSubviews vì tôi nghe nói nó tốt hơn cho hiệu suất.Khi chính xác LayoutSubviews có được gọi cho UITableViewCell tùy chỉnh không?

- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *cellIdentifier = @"FiltersTableViewCell"; 
    FiltersTableViewCell *filtersTableViewCell = [[self dequeueReusableCellWithIdentifier:cellIdentifier] retain]; 
    FiltersTableViewCellItem *filtersTableViewCellItem = [[self.filtersTableViewCellItems objectAtIndex:[indexPath row]] retain]; 

    if (!filtersTableViewCell) 
    { 
     filtersTableViewCell = [[FiltersTableViewCell alloc] initWithFiltersTableViewCellItem:filtersTableViewCellItem]; 
     filtersTableViewCell.delegate = self; 
    } 
    else 
    { 
     filtersTableViewCell.filtersTableViewCellItem = filtersTableViewCellItem; 
    } 
    return [filtersTableViewCell autorelease]; 
} 
+0

@Danny Lin ARC không liên quan gì đến cải thiện hiệu suất. Trong thực tế nó có nhiều tác dụng tương tự như autorelease. –

Trả lời

13

layoutSubviews được gọi tại một số thời điểm sau tableView:willDisplayCell:, được gọi sau tableView:cellForRowAtIndexPath:. Bạn có thể xác minh điều này bằng cách thiết lập các điểm ngắt trong các phương thức liên quan và thấy thứ tự mà chúng bị tấn công. Ví dụ: đặt điểm ngắt ở cuối tableView:cellForRowAtIndexPath:. Sau đó, thêm phương thức sau vào FiltersTableViewCell

- (void)layoutSubviews 
{ 
    [super layoutSubviews]; 
} 

và đặt điểm ngắt tại đó. Sau đó chạy ứng dụng và xem điều gì xảy ra.

+4

Nhưng lưu ý, ngay cả khi 'layoutSubviews' được gọi sau' willDisplayCell', điều đó không có nghĩa là khi vượt qua bố cục vì lợi ích của việc tự định cỡ được thực hiện. Tôi thấy rằng một ô tự định kích thước không được điền cho đến khi 'willDisplayCell' không nhận được chiều cao chính xác, ngay cả khi nó cũng buộc bố cục vượt qua bằng cách gọi' layoutIfNeeded'. Tôi đã phải thay đổi mã của tôi để cư trú trong 'cellForRowAtIndexPath' thay vì tự định kích thước để làm việc. –

-1

Như đã đề cập trong answer này, có rất nhiều trường hợp mà nó sẽ được gọi. Tôi cũng sẽ nói rằng nó có thể được gọi là khi một mặt hàng tái sử dụng được dequeued từ hàng đợi tế bào tái sử dụng. Hãy thử đặt FiltersTableViewCellItem trước khi tìm kiếm các mục có thể sử dụng lại.

1

Thử gọi setNeedsLayout sau khi đặt mục của bạn.

filtersTableViewCell.filtersTableViewCellItem = filtersTableViewCellItem; 
[filtersTableViewCell setNeedsLayout]; 
Các vấn đề liên quan