2016-06-14 70 views
0

當我在代碼中使用FlowLayout對象並在CollectionView對象上調用reloadData()時,我的應用程序崩潰。當我使用標準的FlowLayout(來自XCode的設置)時,我沒有這樣的例外。UICollectionView和reloadData的FlowLayout()

這是我如何使用FlowLayout根據設備寬度計算部分的插圖。

override func viewDidLayoutSubviews() { 
    super.viewDidLayoutSubviews() 

    let layout = UICollectionViewFlowLayout() 
    layout.itemSize = CGSize(width: itemWidth, height: itemWidth) 
    layout.minimumInteritemSpacing = minItemSpacing 
    layout.minimumLineSpacing = minItemSpacing 

    layout.headerReferenceSize = CGSize(width: 0, height: headerHeight) 

    let containerWidth = collectionView.bounds.width 
    if (containerWidth < 350) { 
     inset = 2 
    } 
    else if (containerWidth >= 350 && containerWidth < 400) { 
     inset = 10 
    } 
    else { 
     inset = 14 
    } 
    layout.sectionInset = UIEdgeInsets(top: minItemSpacing, left: inset, bottom: minItemSpacing, right: inset) 

    collectionView.collectionViewLayout = layout 
} 

與這樣的代碼的應用程序啓動正常,但是當我從另一個視圖控制器到主要地方去的CollectionView使用和collectionView.reloadData()被調用有以下例外

@IBAction func saveMyObjects(segue:UIStoryboardSegue) { 
    if let myObjectsViewController = segue.sourceViewController as? MyObjectsViewController { 
     MyObjects.Objects.removeAll() 
     MyObjects.Objects.appendContentsOf(myObjectsViewController.MyObjects) 
     collectionView.reloadData() 
    } 
} 

應用崩潰。

*終止應用程序由於未捕獲的異常 'NSRangeException',原因: '* - [__ NSArrayM objectAtIndex:]:索引0超出界限爲空數組' 的libC++ abi.dylib:與類型的未捕獲的異常終止NSException

如果我評論

// collectionView.collectionViewLayout = layout 

線使用在Xcode值,應用程序的工作原理沒有例外。

附加代碼:

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 

    let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! ObjectCollectionViewCell 
    // Configure the cell 
    cell.imageView.image = UIImage(named: Groups[indexPath.section].Objects[indexPath.row].Image) 
    cell.label.text = Groups[indexPath.section].Objects[indexPath.row].Name 
    if (Groups[indexPath.section].Objects[indexPath.row].Image != "") { 
     cell.label.hidden = true 
     cell.imageView.hidden = false 
    } 
    else { 
     cell.imageView.hidden = true 
     cell.label.hidden = false 
    } 
    return cell 
} 
+0

你可以發佈你的crash stackTrace嗎?看看會發生什麼? –

+0

你好,***由於未捕獲異常'NSRangeException',原因:'*** - [__ NSArrayM objectAtIndex:]:索引0超出空數組界限' ***第一次拋出調用堆棧: (0x182afedb0 0x182163f80 0x1829dedfc 0x1884bcf80 0x1884b95e4 0x1884ba254 0x187de5394 0x187de4870 0x100112048 0x1001121c8 0x187c50224 0x1855e2994 0x1855dd5d0 0x1855dd490 0x1855dcac0 0x1855dc820 0x1855d5de4 0x182ab4728 0x182ab24cc 0x1829dcc70 0x187cc394c 0x187cbe088 0x10013d8fc 0x18257a8b8) 的libC++ abi.dylib:與類型NSException – Anton

+0

@ReinierMelian的XCode的未捕獲的異常終止示出了在 「14開始」 的問題,如果我點擊它,出現以下信息libdyld.dylib'start: 0x18257a8b4 <+0>:nop 0x18257a8b8 <+4>:bl 0x1825b534c;退出 0x18257a8bc <+8>:brk#0x3 – Anton

回答

0

後,審查你的代碼,所以很多時候,我覺得你的問題是,你應該從viewDidLayoutSubviews()刪除代碼和執行現有的UICollectionViewDelegateFlowLayout的方法,你需要什麼,

optional public func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize 

optional public func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAtIndex section: Int) -> CGFloat 

optional public func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAtIndex section: Int) -> CGFloat 

optional public func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize 

optional public func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAtIndex section: Int) -> UIEdgeInsets 

我想,如果實施該方法,並從viewDidLayoutSubviews()刪除你的代碼的代碼將工作,因爲你需要,強烈建議不要做你的方法),我希望這可以幫助你

相關問題