2016-02-24 18 views
5

Tôi có chế độ xem bộ sưu tập nơi tôi đang sử dụng tùy chỉnh UICollectionViewFlowLayout. Chế độ xem bộ sưu tập này có thể tải hình ảnh cục bộ hoặc qua internet. Nếu tôi tải hình ảnh cục bộ thì mọi điều hướng đều hoạt động tốt. Tuy nhiên, nếu tôi tải hình ảnh qua internet, màn hình sẽ tải đúng lần đầu tiên nhưng nếu bạn chạm vào hình ảnh và chuyển đến màn hình khác, sau đó quay lại màn hình đó (tất cả chúng đều nằm trong bộ điều khiển điều hướng) sự cố 'truy cập xấu'. Có ai biết điều gì có thể là lý do.EXC_BAD_ACCESS trên [UICollectionView setCollectionViewLayout:]

Trong viewDidLoad

[self.photosCollectionView registerNib:[UINib nibWithNibName:@"PhotoAlbumPhotosCollectionViewCell" bundle:nil] forCellWithReuseIdentifier:kReuseIdentifierPhotosAlbumPhotosCollectionViewCell]; 

Trong viewWillAppear

[self fetchImagesFromInternetAsynchronously]; 

self.photosCollectionView.dataSource = self; 
self.photosCollectionView.delegate = self; 

self.photosCollectionViewFlowLayout = [UICollectionViewFlowLayout new]; 
self.photosCollectionViewFlowLayout.scrollDirection = UICollectionViewScrollDirectionVertical; 
self.photosCollectionViewFlowLayout.minimumInteritemSpacing = 2.0f; 
self.photosCollectionViewFlowLayout.minimumLineSpacing = 2.0f; 

CGFloat screenWidth = [[UIScreen mainScreen] bounds].size.width; 
CGFloat cellDimension = (screenWidth - 2*self.photosCollectionViewTrailingSpaceConstraint.constant - 3*self.photosCollectionViewFlowLayout.minimumInteritemSpacing)/4 - 1.0; 
CGSize cellSize = CGSizeMake(cellDimension, cellDimension); 
[self.photosCollectionViewFlowLayout setItemSize:cellSize]; 

[self.photosCollectionView setCollectionViewLayout:self.photosCollectionViewFlowLayout]; 

Trong fetchImagesFromInternetAsynchronously, tôi làm một [self.photosCollectionView reloadData] khi hình ảnh đã được tải xuống.

Đây là stack trace:

stop reason = EXC_BAD_ACCESS (code=1, address=0x8) 
frame #0: 0x0000000112da0e09 UIKit`-[UICollectionViewData layoutAttributesForItemAtIndexPath:] + 248 
frame #1: 0x0000000112d4f2d3 UIKit`-[UICollectionView _setCollectionViewLayout:animated:isInteractive:completion:] + 1893 
frame #2: 0x0000000112d4e86b UIKit`-[UICollectionView setCollectionViewLayout:] + 318 
* frame #3: 0x000000010be6b0aa app`-[PhotoAlbumPhotosPickerViewController viewWillAppear:](self=0x00007fd5830d3e00, _cmd="viewWillAppear:", animated=YES) + 1514 at PhotoAlbumPhotosPickerViewController.m:90 
frame #4: 0x000000010eec85fd UIKit`-[UIViewController _setViewAppearState:isAnimating:] + 710 
frame #5: 0x000000010eec8c98 UIKit`-[UIViewController __viewWillAppear:] + 149 
frame #6: 0x000000010eef8a37 UIKit`-[UINavigationController _startCustomTransition:] + 1203 
frame #7: 0x000000010ef08cdb UIKit`-[UINavigationController _startDeferredTransitionIfNeeded:] + 712 
frame #8: 0x000000010ef09cea UIKit`-[UINavigationController __viewWillLayoutSubviews] + 57 
frame #9: 0x000000010f0afc85 UIKit`-[UILayoutContainerView layoutSubviews] + 248 
frame #10: 0x000000010ede4e40 UIKit`-[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 710 
+0

Bạn có thể cung cấp thêm một số mã liên quan đến điều này không. Đặc biệt cách bạn xử lý việc tìm nạp hình ảnh từ internet. \ –

+0

Mọi cuộc gọi đến chế độ xem bộ sưu tập phải được thực hiện trên chuỗi chính. – quellish

Trả lời

5

Incredible!

Đây là những gì cuối cùng đã hiệu quả. Và thậm chí còn có một sự cố tương tự nếu tôi thêm chế độ xem chân trang trong chế độ xem bộ sưu tập mà giải pháp này đã giải quyết.

Thay

self.photosCollectionViewFlowLayout = [UICollectionViewFlowLayout new]; 

với

self.photosCollectionViewFlowLayout = (UICollectionViewFlowLayout*)self.photosCollectionView.collectionViewLayout; 

Hoặc thêm này trong viewWillDisappear (điều này tuy nhiên không thoát khỏi vụ tai nạn nhìn chân, vì vậy sử dụng tốt hơn các phương pháp tiếp cận đầu tiên.

self.photosCollectionView.delegate = nil; 
self.photosCollectionView.dataSource = nil; 
+0

Không hoạt động đối với tôi, ứng dụng không bị lỗi, nhưng chế độ xem bộ sưu tập dường như không phổ biến. Whats thậm chí còn kỳ lạ hơn nữa là tôi chỉ gặp sự cố về sự cố trên trình mô phỏng, tôi không gặp sự cố gặp sự cố với iPhone thực. – Supertecnoboff

+0

Dòng giải pháp của bạn không có gì ... theo như tôi có thể nói. Điều đáng xem lại là tại sao điều này lại hiệu quả. –

+0

Tôi có thể nói với bạn chỉ cần đặt dòng này một mình, làm việc. Loại bỏ nó, và nó không. – OutOnAWeekend

2

Các đối tượng UIKit không phải là chủ đề an toàn. Trong khi bạn không bao gồm mã kích hoạt nó trong qu của bạn estion, có khả năng là fetchImagesFromInternetAsynchronously đang thực hiện công việc trên một luồng khác dựa trên chữ ký phương thức. Và từ chủ đề đó [self.photosCollectionView reloadData] đang được gọi. Chỉ nên truy cập chế độ xem bộ sưu tập từ chuỗi chính:

[[NSOperationQueue mainQueue] addOperationWithBlock:^{ 
    [self.photosCollectionView reloadData]; 
}]; 
+0

Đã cho thử này cũng như nó trông dễ hiểu hơn. Nhưng điều này đã không sửa lỗi. – OutOnAWeekend

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