2016-04-12 2 views
0

Я работаю над «торговым» приложением, где я хотел бы иметь статическое количество ячеек.Отображение двух разных ячеек в виде коллекции - Swift 2.0 iOS

При загрузке пользователи будут видеть 5 ячеек, каждый из которых отображает ярлык с надписью «Добавить».

Когда добавлен «игрок», эта ячейка отображает информацию о игроках, остальные 4 ячейки все еще отображают метку «Добавить». Другой добавлен, 2 ячейки имеют информацию о игроке, 3 имеют «Добавить»

У меня есть время с этим. Может ли кто-нибудь указать мне в правильном направлении? У меня есть настройка пользовательских ярлыков, я думаю, что моя логика может просто отключиться от того, как это сделать правильно.

+0

Можете ли вы показать, что вы пробовали? С какими особенностями вы испытываете трудности? – Paulw11

ответ

4

Вы должны наследоваться UICollectionViewDelegate и UICollectionViewDataSource протоколы в вашем ViewController, то вам необходимо реализовать numberOfItemsInSection и cellForItemAtIndexPath функции. Кроме этого, вам нужно создать два типа клеток в раскадровке и подклассы их, в следующем коде, я буду считать, что вы называете AddedPlayerCell и DefaultCell ваши клетки, я буду считать, что каждая ячейка имеет ярлык называется 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; 
      } 
} 
+0

Красивая, спасибо! – excessive34

0

Для того, чтобы управлять двумя различными типами клеток, вы можете:

  1. Создание 2 прототипа ячеек для вашей точки зрения сбора. Дайте один идентификатор "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. Когда выбрана ячейка в didSelectItemAtIndexPath, проверьте, если он показывает добавлять и затем обрабатывать его соответственно:

    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]) 
    } 
    
+0

Это супер интересный способ сделать это, я нахожу его увлекательным. – excessive34