2016-02-24 26 views
5

Özel bir UICollectionViewFlowLayout kullanıyorum bir koleksiyon görünümü var. Bu koleksiyon görünümü görüntüleri yerel olarak veya internet üzerinden yükleyebilir. Görüntüleri yerel olarak yüklerseniz her gezinme işlemi iyi çalışır. Ancak görüntüleri internet üzerinden yüklüyorsam, ekran ilk kez düzgün bir şekilde yüklenir, ancak bir görüntüye dokunup başka bir ekrana gidip ekrandan geri gelirse (hepsi bir navigasyon denetleyicide) 'kötü erişim' kazası. Sebep ne olabileceğini bilen var mı? görüntüler getirilen olmuştur kez fetchImagesFromInternetAsynchronously yılında EXC_BAD_ACCESS [UICollectionView setCollectionViewLayout:]

[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]; 

viewWillAppear

yılında viewDidLoad

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

yılında

, ben [self.photosCollectionView reloadData] yapmak.

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

Bununla ilgili daha fazla kod sağlayabilir misiniz? Özel olarak, görüntülerin internetten alınmasını nasıl sağlayabilirsiniz. \ –

+0

Koleksiyon görünümüne yapılan her çağrı ana iş parçacığında yapılmalıdır. – quellish

cevap

5

İnanılmaz:

İşte yığın izlemesi!

Sonunda işlenen budur. Ve buna benzer bir çökme bile vardı, eğer bu çözülmüş olan koleksiyon görünümünde altbilgi görünümü eklediysem.

böylece daha iyi ilk yaklaşım kullanmak,

self.photosCollectionViewFlowLayout = [UICollectionViewFlowLayout new]; 

ile

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

değiştirin Veya bu ancak altbilgi görünümü kazasında kurtulmadı (viewWillDisappear bu ekleyin.

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

Benim için çalışmıyor, uygulama çökmez, ancak koleksiyon görünümü doldurmuyor gibi görünüyor. Daha da garip olan şu ki, sadece simülatördeki kilitlenme sorununu yaşıyorum, gerçek iPhone'la ilgili çökme sorunu yaşamadım. – Supertecnoboff

+0

Çözüm hattınız, söyleyebildiğim kadarıyla hiçbir şey yapmıyor. Bunun neden işe yaradığını tekrar araştırmaya değer. –

+0

Sadece bu çizgiyi yalnız bıraktığınızı söyleyebilirim, işe yaradı. Onu kaldırdı ve yoktu. – OutOnAWeekend

2

UIKit nesneleri iş parçacığı için güvenli değildir. estion, fetchImagesFromInternetAsynchronously'un yöntem imzasına dayanarak başka bir iş parçacığı üzerinde çalışmasıdır. Ve bu iplikten [self.photosCollectionView reloadData] çağrılıyor. Toplama görünümüne yalnızca ana konudan erişilebilmelidir:

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

Bunu bir denemeye ek olarak, daha anlaşılabilir görünüyordu. Ancak bu hatayı düzeltmedi. – OutOnAWeekend