2016-01-26 2 views
1

Я пробовал это часами без везения. У меня есть UICollectionView collectionView. Представление коллекции - это в основном список с последней ячейкой, всегда являющейся ячейкой с большим значком плюс для добавления другого элемента. Я разрешил переупорядочивать следующее. Я бы хотел, чтобы это было, когда я начинаю интерактивное движение, клетка с плюсом уходит, а затем, когда пользователь закончил редактирование, он появляется снова. Это базовая версия кода у меня есть:Временно сокрытие ячейки в UICollectionView Swift iOS

func handleLongGesture(gesture: UILongPressGestureRecognizer) { 

     switch(gesture.state) { 

     case UIGestureRecognizerState.Began: 

      ... 

      self.collectionView.beginInteractiveMovementForItemAtIndexPath(selectedIndexPath) 

      removeAddCell() 

     case UIGestureRecognizerState.Changed: 


     case UIGestureRecognizerState.Ended: 

      ... 


      collectionView.endInteractiveMovement() 
      replaceAddCell() 

     default: 

      collectionView.cancelInteractiveMovement() 
     } 
    } 


    func removeAddCell(){ 

     print("Reloading data - removing add cell") 

     data_source.popLast() 

     self.collectionView.reloadData() 

    } 

    func replaceAddCell(){ 

     print("Reloading data - replacing add cell") 

     data_source.append("ADD BUTTON") 

     self.collectionView.reloadData() 

    } 

Это очень грубый псевдокод, но я не могу даже получить самую простую версию этой работы. С кодом, который у меня есть, он дает мне страшную «Неустранимая ошибка: неожиданно найденный nil при распаковке необязательных значений» в строке, где я ссылаюсь на UICollectionViewCell после удаления элементов из источника данных.

Если кто-то, кто сделал что-то подобное, может поделиться своим подходом, я бы очень признателен! Спасибо!

-Bryce

+0

Вместо того, чтобы удалить его, почему бы не просто скрыть его с помощью непрозрачности (альфа) и отключить взаимодействие с пользователем? Это может быть лучшим пользовательским интерфейсом, чтобы знак плюса был тусклым, а не исчезал вообще. Если вы начнете перетаскивать что-то, а другое исчезнет, ​​может показаться, что что-то пошло не так. – Michael

+0

Можно использовать показать нам, какая строка имеет фатальную ошибку? –

+0

Я попытался спрятать его, используя alpha 0, но ячейка все еще существует, поэтому, если пользователь перемещает ячейку сверху вниз, есть пробел во второй-последней позиции, где находится ячейка Add. @Майкл – brycejl

ответ

0

Я сделал что-то вроде этого. Источник данных для представления коллекции отслеживает BOOL, чтобы определить, показывать ли ячейку «Добавить элемент». И позвоните insertItemsAtIndexPaths: и deleteItemsAtIndexPaths:, чтобы оживить элемент Item Item, появляющийся и исчезающий. Я использую кнопку «Изменить» для переключения режимов. Но вы можете адаптировать этот код для использования распознавателя жестов.

базовый код:

self.editing = !self.editing; // toggle editing mode, BOOL that collection view data source uses 
NSIndexPath *indexPath = [self indexPathForAddItemCell]; 
if (!self.editing) { // editing mode over, show add item cell 
    if (indexPath) { 
     [self.collectionView insertItemsAtIndexPaths:@[indexPath]]; 
    } 
} 
else { // editing mode started, delete add item cell 
    if (indexPath) { 
     [self.collectionView deleteItemsAtIndexPaths:@[indexPath]]; 
    } 
} 
0

Вы можете сделать что-то вроде этого:

func longPressed(sender: UILongPressGestureRecognizer) { 
    let indexPath = NSIndexPath(forItem: items.count - 1, inSection: 0) 
    let cell = collectionView.cellForItemAtIndexPath(indexPath) as! YourCollectionViewCell 
    switch sender.state { 
    case .Began: 
     UIView.animateWithDuration(0.3, animations: { 
      cell.contentView.alpha = 0 
     }) 

    case .Ended: 
     UIView.animateWithDuration(0.3, animations: { 
      cell.contentView.alpha = 1 
     }) 

    default: break 
    } 
} 

таким образом она постепенно исчезает, а не резко.

Смежные вопросы