2014-07-06 15 views
8

Rất tò mò, có thể tắt chức năng sử dụng lại trên UICollectionview không? Tôi có một số lượng giới hạn các ô, có thể khác nhau, nhưng việc tái khởi động của ô có thể hơi nặng và tôi không nên sử dụng lại chúng. Đang cố gắng để khởi tạo các tế bào mà không dequeueReusableCellWithReuseIdentifier tôi nhận được ngoại lệ:UICollectionView mà không cần sử dụng lại các ô

NSInternalInconsistencyException 'lý do:' chế độ xem trở về từ collectionView: cellForItemAtIndexPath: không được lấy ra bằng cách gọi -dequeueReusableCellWithReuseIdentifier: forIndexPath.

Trả lời

7

các Reinitialization của tế bào có thể là một chút nặng

Nó không chắc rằng đặt lại các nội dung của một tế bào sẽ đắt hơn so với việc tạo ra một cái mới - toàn bộ các điểm tái sử dụng tế bào là cải thiện hiệu suất bằng cách tránh sự cần thiết phải liên tục tạo ra các tế bào mới.

Đang cố gắng để khởi tạo các tế bào mà không dequeueReusableCellWithReuseIdentifier tôi nhận được ngoại lệ:

tôi coi đó là một dấu hiệu mạnh mẽ rằng câu trả lời cho câu hỏi của bạn là không. Ngoài ra, the documentation says:

... chế độ xem bộ sưu tập yêu cầu bạn luôn giảm bớt lượt xem, thay vì tạo chúng một cách rõ ràng trong mã của bạn.

Vì vậy, một lần nữa, không.

4

Để vô hiệu hóa việc tái sử dụng các tế bào, hãy khử đi ô của bạn bằng một số nhận dạng cụ thể cho đường dẫn chỉ mục ô đó và đăng ký số nhận dạng đó trước khi thực hiện.

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSString *identifier = [NSString stringWithFormat:@"Identifier_%d-%d-%d", (int)indexPath.section, (int)indexPath.row, (int)indexPath.item]; 
    [collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:identifier]; 

    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath]; 

    // ... 
    // ... 
    // ... 
} 

Lưu ý rằng việc sử dụng lại không hoàn toàn tắt theo phương pháp trên do có số nhận dạng cho mỗi ô, đó là điều mọi người có thể sẽ cần. Nhưng nếu bạn cần phải hoàn toàn vô hiệu hóa các tế bào tái sử dụng, bạn có thể làm như sau.

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static int counter = 0; 

    NSString *identifier = [NSString stringWithFormat:@"Identifier_%d", counter]; 
    [collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:identifier]; 

    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath]; 

    counter++; 

    // ... 
    // ... 
    // ... 
} 

QUAN TRỌNG: Tôi chỉ trả lời câu hỏi ở đây, điều này là hoàn toàn không được khuyến khích , đặc biệt là phương pháp thứ hai. Tôi sử dụng phương pháp đầu tiên trên một trường hợp mà tôi có nhiều hướng cuộn và có một số phương pháp đại biểu liên quan đến tập trung vào tvOS mà tôi cần phải nhận được gọi cho mỗi tế bào.

+0

Tồi tệ hơn không được đề xuất; không có cách nào để hủy đăng ký tất cả các số nhận dạng đó, vì vậy ứng dụng của bạn có thể sẽ gặp sự cố khá nhanh chóng. :-) – dgatwood

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