2015-08-03 5 views
0

Я пытаюсь сделать UICollectionViewCell отображением некоторой информации, щелкнув ее один раз и сделав ее содержимое пропавшим, щелкнув его снова. Первое, что приходит мне на ум, - использовать didSelectItemAtIndexPath/didDeselectItemAtIndexPath. Однако это не работает, поскольку после вызова метода reloadData() каждый статус «выбранной» ячейки возвращается к «unselected», так что метод didDeselectItemAtIndexPath никогда не вызывается.UICollectionView не вызывает didDeselectItemAtIndexPath после reloadData

Есть ли какой-нибудь умный способ обойти эту проблему? Большое спасибо за вашу любезную помощь заранее!

func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) { 
    // do something 
     self.UICollectionView.reloadData() 
} 

func collectionView(collectionView: UICollectionView, didDeselectItemAtIndexPath indexPath: NSIndexPath) { 
    // do something else 
} 

Благодарим вас за вашу неоценимую помощь! Я последовал вашим советам, добавив логическую переменную, чтобы отслеживать, отображает ли ячейка что-то или нет, и использовать метод didSelectItemAtIndexPath. Теперь это работает!

Я считаю, что подход BaseZen также будет работать и является более законным. Но так как я не хочу менять слишком много кодов, поэтому я выбрал более удобный. Но спасибо все равно!

+1

Вы можете использовать некоторую дополнительную переменную и манипулировать ею вручную в методе didSelectItemAtIndexPath, который вызывается каждый раз, когда вы выбираете строку –

+1

. Я не думаю, что вам нужно вызвать reloadData(). Вы можете обновить свою ячейку без этого. – Caleb

ответ

2

Вы не используете идиому выбора/отмены выбора ячеек. Неправильное дерево. Вместо этого вам понадобится ваш пользовательский UICollectionViewCell, чтобы прослушать события Touch Up Inside и сопоставить каждое касание базовой модели данных. Затем, когда происходит подправить событие, вы посмотрите значение как так:

@IBAction func userDidTouchMeLittleCustomCell(sender: UIView) { 
    if myCustomDataModel[sender.tag].numTapsSoFar == 0 { 
     // do the first UI thing, and then: 
     myCustomDataModel[sender.tag].numTapsSoFar++ 
    } 
    else { 
     // do the second UI thing, and maybe reset the model? Or whatever applies. 
    } 
} 

Теперь, вы должны быть уверены, что UIView получает сенсорное событие оборудуется с соответствующим tag, который может быть обработан по методу cellForItemAtIndexPath.

Для того, чтобы не сломать идиом выбора/отмены выбора, вы можете иметь это поведение только для subview вашей пользовательской ячейки.

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