在集合视图中显示两个不同的单元格 – Swift 2.0 iOS

我正在一个“交易”应用程序,我想有一个静态数量的单元格。

加载时,用户将看到5个单元格,每个单元格显示一个标签,上面写着“添加”。

当添加“玩家”时,该单元显示玩家信息,其他4个单元仍显示“添加”标签。 另外还有2个单元格有玩家信息,3个有“添加”

我有一个这个地狱。 任何人都可以指出我的方向正确吗? 我有自定义标签设置,我想我的逻辑可能只是closures如何正确执行此操作。

您需要在您的viewController中inheritanceUICollectionViewDelegateUICollectionViewDataSource协议,然后您需要实现numberOfItemsInSectioncellForItemAtIndexPath函数。 除此之外,您需要在故事板中创build两种types的单元格和子类,在下面的代码中,我将假设您调用了AddingPlayerCellDefaultCell您的单元格,我会假设每个单元格都有一个名为labelText的标签。

let players = ["Player1","Player2"] //players added till now let numberOfCells = 5 //Here you set the number of cell in your collectionView func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return max(players.count,numberOfCells); } func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { if((indexPath.row + 1) < self.players.count){ //If index of cell is less than the number of players then display the player let cell = collectionView.dequeueReusableCellWithReuseIdentifier("yourIdentifierForAddedPlayerCell", forIndexPath: indexPath) as! AddedPlayerCell cell.labelText.text = self.players[indexPath.row] //Display player return cell; }else{//Else display DefaultCell let cell = collectionView.dequeueReusableCellWithReuseIdentifier("yourIdentifierForDefaultCell", forIndexPath: indexPath) as! DefaultCell cell.labelText.text = "Add" return cell; } } 

为了pipe理两种不同的细胞types,您可以:

  1. 为您的collections视图创build2个原型单元格。 给一个标识符"Add"和另一个"Info""Add"单元格原型将包含标签"Add" ,并且"Info"单元格原型将包含显示球员信息的字段。
  2. 添加一个数组属性到你的类,跟踪哪些单元格显示“添加”。 var showingAdd = [true, true, true, true, true]
  3. cellForItemAtIndexPath ,检查showingAdd数组以确定在将该单元出列时使用哪个标识符:

     let identifier = showingAdd[indexPath.row] ? "Add" : "Info" let cell = dequeueReusableCellWithIdentifer(identifier...) if !showingAdd[indexPath.row] { // configure the cell with the proper player info // retrieve info from info property array item created in // step 4. let player = playerInfo[indexPath.row] cell.playerName = player.name ... } 
  4. 当在didSelectItemAtIndexPathselect一个单元格时,检查它是否显示添加,然后相应地处理它:

     if showingAdd[indexPath.row] { // query user to get player info // store the info in a property array indexed by `indexPath.row` playerInfo[indexPath.row] = PlayerInfo(name: name, ...) showingAdd[indexPath.row] = false // trigger a reload for this item collectionView.reloadItemsAtIndexPaths([indexPath]) }