2015-01-13 48 views
7

Tôi đang đặt hình ảnh, được tải xuống bằng sdwebimage, trong số UITableViewCell. Để giữ UITableView hiển thị hình ảnh sai, tôi cần đặt hình ảnh thành nil trong prepareForReuse. Tuy nhiên, tôi đang gặp một số vấn đề khi thực hiện điều này.Làm cách nào để triển khai `prepareForReuse`?

Đây là nơi tôi đặt hình ảnh:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString * reuseIdentifier = @"programmaticCell"; 
    MGSwipeTableCell * cell = [self.tableView dequeueReusableCellWithIdentifier:reuseIdentifier]; 
    if (!cell) { 
     cell = [[MGSwipeTableCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:reuseIdentifier]; 
    } 

    CGFloat brightness = [UIScreen mainScreen].brightness; 

    cell.textLabel.text = [self.streams[indexPath.row] name]; 
    cell.detailTextLabel.text = [self.streams[indexPath.row] published]; 

    NSString *imageUrl = [NSString stringWithFormat: @"%@", [self.streams[indexPath.row] photo]]; 

    NSLog(@"Image is: %@ and path is: %d", imageUrl, indexPath.row); 

    [cell.imageView sd_setImageWithURL:[NSURL URLWithString:imageUrl] 
         placeholderImage:[UIImage imageNamed:@"tile-blue.png"] options:indexPath.row == 0 ? SDWebImageRefreshCached : 0]; 

    cell.delegate = self; //optional 

    return cell; 
} 

Khi tôi thực hiện - (void)prepareForSegue Xcode giữ ném lỗi nói rằng cell là không có sẵn cho nó. Cách thích hợp để thực hiện điều này là gì?

+1

'prepareForReuse' được thực hiện trên' của bạn MGSwipeTableCell'. Ở đây, tham chiếu đến ô được gọi là 'self' thay vì' ô'. –

+0

Nhưng nếu tôi làm 'self.textLabel = nil', nó ném' Property 'textLabel' không tìm thấy trên đối tượng kiểu 'ViewController'' – user4334509

+1

Bạn đã nhầm lẫn 'prepareForSegue' trên' ViewController' của bạn khi thực hiện 'prepareForReuse' trên 'MGSwipeTableCell' của bạn. Đi đến '@implementation MGSwipeTableCell' của bạn và triển khai' prepareForReuse' ở đó. –

Trả lời

10

Hãy thử thêm này để MGSwipeTableCell.m của bạn:

-(void)prepareForReuse 
{ 
    [super prepareForReuse]; 

    self.textLabel.text = @""; 
    self.detailTextLabel.text = @""; 
    self.imageView.image = nil; 
} 
+7

Là một nhận xét về giải pháp ở trên, mà Mike có thể biết (chỉ là mã demo): Không triển khai PrepareForReuse để đặt lại nội dung của ô. Nó chỉ nên thiết lập lại sự xuất hiện. Từ tài liệu: "Vì lý do hiệu suất, bạn chỉ nên đặt lại các thuộc tính của ô không liên quan đến nội dung, ví dụ: trạng thái alpha, chỉnh sửa và chọn.". Hơn nữa: "Đại biểu của bảng xem trong tableView: cellForRowAtIndexPath: nên luôn đặt lại tất cả nội dung khi sử dụng lại một ô". Đặt nội dung như văn bản trong cellForRowAtIndexPath, đặt lại hình thức trong '' 'prepareForReuse'''. –

+0

Cảm ơn lời giải thích đó. Tôi thực sự không biết điều đó. Tôi sẽ ghi nhớ điều đó trong tương lai. Thông thường tôi đặt nội dung trong cellForRowAtIndexPath nhưng đôi khi đặt lại nội dung trong PrepareForReuse. –

+3

Bạn đang rất hoan nghênh! Tôi tình cờ gặp điều này cách đây không lâu. Bạn nên ghi nhớ khi cố gắng đạt được hiệu suất tốt nhất từ ​​UITableView. –

Các vấn đề liên quan