2014-07-08 111 views
1

我試圖在Swift中創建一個非常基本的集合視圖控制器,它允許我列出一些數字,當我點擊其中一個數字時,它會帶我到一個簡單的說明一個標籤)你點了多少號碼。UICollectionView數組索引超出範圍

故事板: 我的故事板有一個作爲根的導航控制器和一個被加載的集合視圖控制器。這包含一個單元格,他有一個單元格的標識符。這個單元格有一個按鈕,用作細節頁面的一個細節。我已經指定了數據源指向自己(控件點擊了視圖控制器來建立數據源),並且我已經將showue唯一標識爲showDetail。

當我加載應用程序,它顯示我的按鈕7次,但是當我點擊其中任何一個,我在下面的橫線得到的指數超出範圍:

這裏是我的代碼:

進口基金會 進口的UIKit

class WeekCollectionView : UICollectionViewController 
{ 
    override func collectionView(collectionView: UICollectionView!, numberOfItemsInSection section: Int) -> Int 
    { 
     return 7 
    } 

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

    { 
     let cell: ShiftCell = collectionView.dequeueReusableCellWithReuseIdentifier("cell", forIndexPath: indexPath) as ShiftCell 
     return cell; 
    } 

    override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) 

    {  
     if (segue.identifier == "showDetail") { 
      **//CRASHES ON THIS LINE BELOW FOR THE ARRAY [0]** 
      let indexPaths: NSArray = self.collectionView.indexPathsForSelectedItems()[0] as NSArray 
      let destinationViewController = segue.destinationViewController as DetailViewController 
      //var someNumber = images[indexPath.row] 
      destinationViewController.mySpecialID = 1 //replace this with someNumber, always set 1 for now as a test 
     } 
    } 
} 

我的手機(上圖)類很簡單:

class ShiftCell: UICollectionViewCell { 
    init(frame: CGRect) { 
     super.init(frame: frame) 
    } 

    init(coder aDecoder: NSCoder!) { 
     super.init(coder: aDecoder) 
    } 

} 

我真的不確定我做錯了什麼 - 也許還有其他事情需要發生在我的故事板?我遵循了蘋果公司的一個教程(在Objective-C中),該教程非常完美,如果我沒有弄錯,所有的代碼都是相同的!

我真的被困在這裏,非常感謝,如果任何人都可以指出我在正確的方向! :)

回答

0

由於沒有選定的項目,您正在收到此次崩潰。您在單元格頂部有一個按鈕,可以阻止觸摸到達單元格以實際選擇它。你將不得不想出一個不同的方式來識別每個按鈕所代表的行。一個常見的模式是使用按鈕的tag屬性。這可以存儲任意的整數以幫助您識別視圖。

所以,在collectionView:cellForItemAtIndexPath您應該將按鈕的標籤設置爲當前指數:

override func collectionView(collectionView: UICollectionView!, cellForItemAtIndexPath indexPath: NSIndexPath!) -> UICollectionViewCell! 
{ 
    let cell: ShiftCell = collectionView.dequeueReusableCellWithReuseIdentifier("cell", forIndexPath: indexPath) as ShiftCell 
    cell.myButton.tag = indexPath.item 
    return cell; 
} 

那麼相信SEGUE的sender將是按鈕。您可以從獲得指數重回:

override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) 
{  
    if (segue.identifier == "showDetail") { 
     var possibleIndex : Int? 
     if let button = sender as? UIButton { 
      possibleIndex = button.tag 
     } 

     if let index = possibleIndex { 
      // ... 
     } 
    } 
} 

注意:我不肯定,發件人將是按鈕,我通常通過代碼做的事情沒有一個故事板。如果發件人不是按鈕,則可以始終以「舊時尚方式」進行操作,然後將按鈕從Storyboard上鉤到視圖控制器上的某個方法,而不是使用Segue。然後,您可以在代碼中創建新的控制器,然後根據需要進行顯示。

+0

非常感謝你 - 我會在稍後嘗試。所以,如果我點擊按鈕,並向下滾動到「標籤」,我可以給它一個像200或什麼的東西?就是這樣?這個「中繼器」會讓每個按鈕的標籤是200嗎? – NullHypothesis

+0

所以我給了這個嘗試,它仍然崩潰(我點擊單元格內的按鈕,並將標籤設置爲198)。我需要給每個按鈕一個獨特的標籤,因爲它重複?就像我在單元格中只有一個按鈕,每次迭代發生時,我是否需要以編程方式爲按鈕指定一個唯一標記? – NullHypothesis

+0

@ user3379785我用一些示例代碼更新了我的答案。你確實需要爲每個按鈕設置一個唯一的標籤。更具體地說,您希望單元格上的標籤與其顯示的索引完全匹配。 – drewag