2013-03-23 29 views
5

Tôi có ứng dụng IOS, sử dụng UICollectionView để hiển thị lưới ô ngang. Tất cả tôi cần, là một cách thông minh (lười) tải dữ liệu khi người dùng đến cuối UICollectionView của tôi. Mã tôi đang sử dụng bây giờ là:Kỹ thuật tải lười cho UICollectionView

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

    GridCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:Cell forIndexPath:indexPath]; 


    /** 
    TODO 
    - Find a good way to check if the user has reach the end of the grid 
    - This next piece of code is for demonstration purposes. A real check has to be 
    done yet!!! 
    **/ 

    // releases is my datasource // 

    if(indexPath.row == (releases.count - 1)) { 
     [self getNextListData]; 
    } 

    return cell; // <-- finally return the cell 


} 

Vấn đề với mã này là: nếu người dùng cuộn nhanh đến cuối, anh phải cuộn qua lại để tải thêm mục. Điều này thực sự không thân thiện với người dùng và tôi cần một cách tốt hơn để tải các mục khi cần thiết.

Có ai có bất kỳ đề xuất nào không?

Xin cảm ơn trước.

+0

Tôi giả sử bạn không biết số đếm trong danh sách để bắt đầu, đây có phải là trường hợp không? – gaige

Trả lời

2

Khi tôi gặp sự cố này với chế độ xem bảng, tôi phải thực hiện một số thử nghiệm người dùng. Tôi thấy rằng nếu tôi bắt đầu tải 10 ô trước khi kết thúc bảng, ô mới sẽ sẵn sàng. Giả sử rằng bạn đang tải nền dữ liệu, nghĩa là.

if (indexPath.row >= [releases count] - 10) 
    [self getNextListData]; 

Bạn sẽ muốn thực hiện một số kiểm tra để xem số nào phù hợp với mình.

Ngoài ra, tôi cũng có một ô chỉ báo tải. Trong số hàng của tôi trong phần gọi lại, tôi luôn trả về thêm 1.

return [releases count] + 1; 

Khi bắt đầu cuộc gọi lại hàng, tôi đã trả về một ô chỉ báo tải đặc biệt.

if (indexPath.row == [releases count]) 
    return [JLTActivityCell sharedInstance]; 

Tôi không chắc chắn chính xác lời khuyên đó sẽ áp dụng cho chế độ xem bộ sưu tập như thế nào, nhưng hy vọng nó sẽ giúp bạn chỉ hướng tốt.

5

UICollectionView được kế thừa từ UIScrollView. UIScrollView có một đại biểu, UIScrollViewDelegate có một loạt các phương pháp liên quan đến cuộn. Trong một trong các phương thức ủy nhiệm này (chẳng hạn như scrollViewDidBeginDecelerating:), bạn có thể kiểm tra xem bạn đang ở xa bao xa, với thuộc tính contentOffsetcontentSize. Nếu bạn gần đến cuối (được xác định bởi bất kỳ% nào là kết thúc cho bạn), hãy tìm nạp thêm dữ liệu.

Lợi thế khi sử dụng phương pháp cuộn là nó sẽ không làm cho collectionView:cellForItemAtIndexPath: trở nên chậm hơn (bằng cách buộc nó chạy mã cho mọi collectionview không cần thiết).

Điều này về cơ bản là cùng một kỹ thuật mà Apple đề xuất cho việc tải xuống dữ liệu UITableView, áp dụng hơi khác một chút. Họ cũng có một số mã mẫu cho điều đó (chẳng hạn như LazyTableImages)

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