2012-10-31 13 views
15

Tôi có một UICollectionView trong một UIViewController. Trong phương thức collectionView cellForItemAtIndexPath: nó tạo ra một loạt các ô tùy chỉnh dựa trên nguồn dữ liệu. Các ô tùy chỉnh lần lượt chứa một UIView, được phân lớp để vẽ các trang PDF đơn lẻ.UICollectionView hiển thị các ô sai sau khi di chuyển - vấn đề dequeue?

Nó được thiết lập theo cách tách một tệp PDF thành các trang duy nhất của nó, do đó ô 1 chứa trang PDF 1, ô 2 chứa trang PDF 2, v.v. Cho đến nay rất tốt, đây là vấn đề của tôi:

Khi tôi cuộn xuống, UICollectionView bắt đầu hiển thị các ô sai. Ví dụ trong một tài liệu 34 trang, nó cho thấy các ô/trang 1-16 theo thứ tự đúng, nhưng sau đó bắt đầu hiển thị các trang mà dường như đã bị xóa thêm, chẳng hạn như ô 1, ô 2, ô 4. Tôi chưa bao giờ đến bất kỳ nơi nào gần ô/trang 34.

Tôi đã nhìn thấy hành vi tương tự từ UITableView trong quá khứ và tin rằng nó có liên quan đến việc dequeueing của ô hoặc phương thức đại biểu. Không hoàn toàn chắc chắn - bất kỳ trợ giúp nào đều được đánh giá cao.

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { 

//create custom cell 
CustomCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"cellID" forIndexPath:indexPath]; 

//set file name (always the same; one PDF file) 
cell.fileName = fileName; 
cell.backgroundColor = [UIColor clearColor]; 

//set the title to the page number 
cell.title = [NSString stringWithFormat:@"page %@", [countArray objectAtIndex:indexPath.row]]; 

//set the current page (which indicates which page to display) according to the pageCount 
cell.currentPage = [[countArray objectAtIndex:indexPath.row] intValue]; 

return cell; } 
+0

Có lẽ tôi có cùng một vấn đề. Bạn đã tìm thấy một giải pháp? – chris

Trả lời

14

Tôi đã gặp sự cố về similare. Điều này rất có thể vì các tế bào tái sử dụng không tự vẽ lại. Trong nội dung lớp (xem PDF của bạn) tế bào tùy chỉnh của bạn, kích hoạt vẽ lại nếu khung được cập nhật:

-(void)setFrame:(CGRect)frame { 
    [super setFrame:frame]; 
    [self setNeedsDisplay]; // force drawRect: 
} 

này đã làm việc cho tôi. Ngoài ra, nếu kích thước ô của bạn có thể thay đổi, hãy đặt mặt nạ tự động hóa sao cho nó lấp đầy khoảng trống với

trong khi khởi tạo.

+1

Điều này phù hợp với tôi - cảm ơn sự giúp đỡ của bạn. Gọi phương thức setFrame ở trên từ bên trong ô CellForItemAtIndexPath của UICollectionView, buộc các tệp PDF phải vẽ lại. Cảm ơn nhiều. –

+0

Tuyệt vời! Việc gọi 'setFrame:' ​​chính bạn có lẽ không cần thiết vì chế độ xem bộ sưu tập thực hiện điều này. – chris

+0

đặt mặt nạ thay đổi kích thước đã giúp, – peko

12

Cố định vấn đề tương tự sử dụng phương pháp prepareForReuse

chỉ cần thêm phương pháp này để thực hiện tế bào tùy chỉnh của bạn

- (void)prepareForReuse { 

    self.fileName = nil; 
    self.title = nil; 

    // add remaining properties 

} 
+0

khi nào tôi gọi điện thoại? –

+2

@PuneethKamath bạn không cần phải gọi phương thức này, chỉ cần thêm điều này trong bạn UICollectionViewCell subclass –

+3

không hoạt động cho tôi – AndrewK

1

tôi cố định một vấn đề tương tự trong nhanh chóng dựa trên câu trả lời Asatur Galstyan của.

Sau khi liên kết một lớp tùy chỉnh đến một ô trong một kịch bản các prepareForReuse() chức năng có thể được overriden:

import UIKit 

class SomeCollectionViewCell: UICollectionViewCell { 

    @IBOutlet weak var exampleView: UIView! 
    @IBOutlet weak var exampleLabel: UILabel! 

    override func prepareForReuse(){ 
     super.prepareForReuse() 
     exampleLabel.textColor = nil 
     exampleView.backgroundColor = nil 
     exampleView.layer.cornerRadius = 0 
    } 
} 

Có thực hiện mặc định của prepareForReuse() không làm gì (ít nhất là trong iOS 10) nhưng Apple recommends calling the the super.prepareForReuse() when overriding anyway.

+1

Làm việc từ ví dụ của bạn, tôi đã tìm thấy 'exampleView.setNeedsDisplay()' trong 'prepareForReuse()' Đã giải quyết vấn đề. – JKaz