2017-09-25 112 views
-1

以下情況:傳輸數據從一個視圖到另一個Swift 3

我有2個控制器,一個ViewController和一個CollectionViewController。普通的ViewController應該從用戶那裏收集數據,並且當單擊開始按鈕時,算法解決了這個問題並返回結果。結果應該被傳送到CollectionViewController,並且基於解決方案構建CollectionView。

下面是我用於啓動按鈕的代碼。正如你所看到的,該算法被調用,結果存儲在幾個變量中,現在我試圖將matrixArray傳遞給我的CollectionViewController(它是第一次測試)。該CollectionViewController應該使用這個存儲陣列中的數據呈現某種形式的畫面

 @IBAction func startButton(_ sender: Any) { 
    ... 

    let solution = PrimalSimplex(problem: problem, currentSolution: currentSolution) 

    matrixArray = solution.0 
    basicArray = solution.1 
    maxArray = solution.2 
    currentSolutionArray = solution.3 
    isOptimal = solution.4 
    isCyceling = solution.5 

    let CollectionVC = storyboard?.instantiateViewController(withIdentifier: "CollectionView") as! CollectionViewController 
    CollectionVC.testMatrix = matrixArray 
} 

到目前爲止好,數據到達是在CollectionViewController可用按下起動按鈕後。但是當我嘗試使用數據來構建CollectionView時,我收到一條錯誤消息。

這是我在collectionViewController用於構建的CollectionView的代碼(它的工作前,用靜態值,當我嘗試使用值,該算法返回......出現的問題):

class CollectionViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout { 

@IBOutlet weak var myCollectionView: UICollectionView! 

// Creates an empty array for the values 
var testMatrix = Array<Matrix>() 

//Setup CollectionView: Table to display LPs 
let reuseIdentifier = "cell" 
var items = testMatrix[0]   <----ERROR 

// MARK: - UICollectionViewDataSource protocol 

// tell the collection view how many cells to make 
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
    return items.count 
} 

// make a cell for each cell index path 
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
    // get a reference to our storyboard cell 
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath as IndexPath) as! MyCollectionViewCell 

    // Use the outlet in our custom class to get a reference to the UILabel in the cell 
    cell.myLabel.text = items[indexPath.item] 
    cell.backgroundColor = UIColor(red:0.94, green:0.94, blue:0.94, alpha:1.0) // make cell more visible in our example project 

    // Change shape of cells 
    cell.layer.cornerRadius = 8 

    return cell 
} 
.... 
顯示在VAR項目

錯誤= testMatrix [0]:

Cannot use instance member 'testMatrix' within property initializer; property initializers run before 'self' is available 

我可以理解,這裏的Xcode有問題,因爲它不能確保testMatrix已存儲的值....我想這個問題。我試圖使用,如果讓/警衛聲明,但沒有解決問題。

任何關於如何解決這個問題的建議或什麼是錯誤的? 也許有更好的方法將數據從第一個VC傳輸到另一個?

+0

使用,在'viewDidLoad中()'或'viewWillAppear中()' –

+0

https://stackoverflow.com/a/45423454/8432814閱讀這個答案更多的澄清 –

回答

0

您無法在類級別初始化來自其他相關屬性的屬性。

您應該嘗試初始化爲viewDidLoad

var items: Matrix? 
override func viewDidLoad() { 
    super.viewDidLoad() 
    if testMatrix.count>0{ 
     items = testMatrix[0] 
    } 

} 
+0

感謝您的回答。有效。 但現在我有一個新的問題。我的CollectionViewController沒有viewDidLoad方法(我遵循這個教程:https://stackoverflow.com/questions/31735228/how-to-make-a-simple-collection-view-with-swift)。我已經添加了它,但是當我點擊開始按鈕時,collectionView不再顯示。 可能有一個非常簡單的解決方案,但由於我是編程新手,我不知道該怎麼做。你有好主意嗎? – Bepa1012

+0

'讓CollectionVC = storyboard?.instantiateViewController(withIdentifier:「CollectionView」)as! CollectionViewController CollectionVC.testMatrix = matrixArray CollectionVC.items = matrixArray [0]' –

+0

再次感謝您的答案。這不起作用。 我一直在玩更多...但迄今沒有運氣。看起來,當我點擊開始按鈕時,數據將被傳輸到CollectionVC(我使用斷點來查看數據是否正確),但是在segue之後數據將被重新初始化,並且沒有數據可以從CollectionView 。 目前不知道如何解決這個問題。只是爲了澄清,哪個VC包含viewDidLoad方法?我在兩家風險投資公司都試過,但似乎並沒有解決問題。 – Bepa1012

相關問題