在Swift 3

时间:2017-09-25 12:15:55

标签: ios swift swift3 uiviewcontroller

以下情况:

我有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 items = testMatrix [0]:

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

我可以理解Xcode在这里有问题,因为它无法确定testMatrix是否存储了值....我认为这个问题。我尝试使用if let / guard语句,但这并没有解决问题。

关于如何解决它的任何建议或者这里有什么问题? 也许有更好的方法将数据从第一个VC传输到另一个VC?

1 个答案:

答案 0 :(得分:0)

您无法在班级别从其他相关属性初始化属性。

您应该尝试在viewDidLoad初始化。

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

}