Как выбрать элемент/ячейку UICollectionView из кода

Я реализовал UICollectionView в своем приложении. Моя проблема в том, что мне нужно выбрать (например, если пользователь нажал на нее) ячейку programmatically. Метод:

- (void)selectItemAtIndexPath:(NSIndexPath *)indexPath 
                     animated:(BOOL)animated 
               scrollPosition:(UICollectionViewScrollPosition)scrollPosition

Это часть класса UICollectionView, это не то, что мне нужно вызывать, так как этот метод не вызывает:

- (void)collectionView:(UICollectionView *)collectionView 
        didSelectItemAtIndexPath:(NSIndexPath *)indexPath

Он просто устанавливает для свойства selected ячейки значение YES;


person Nikola Kirev    schedule 13.12.2012    source источник
comment
Как насчет того, чтобы вызвать метод самостоятельно после того, как вы выбрали свою ячейку? Вы можете вызвать [self collectionView:yourView didSelectItemAtIndexPath:yourIndexPath];   -  person Boris Prohaska    schedule 13.12.2012
comment
Возможно, этот ответ поможет вам stackoverflow.com/questions/13177201 /   -  person Диляна Тодорова    schedule 01.03.2013
comment
@ДилянаТодорова Да. Спасибо! Я знал о didSelectItemAtIndexPath, но искал способ, который не является частью UICollectionView Delegate Protocol. Я понял. Теперь все работает нормально.   -  person Nikola Kirev    schedule 01.03.2013


Ответы (3)


Я вызываю [self collectionView:yourView didSelectItemAtIndexPath:yourIndexPath] для программного выбора ячейки. Но в ячейке метода всегда ноль. Это отлично работает, когда пользователь выбирает ячейку.

person Shirish Kumar    schedule 13.06.2013
comment
или быстро вы могли бы использовать: collectionView.delegate?.collectionView!(collectionView, didSelectItemAtIndexPath: someIndexPath) - person mbuff24; 04.05.2015
comment
Это работает, хотя напрямую вызывать методы делегата — плохая практика (представление коллекции должно вызывать этот метод для своего делегата, как рекомендует Apple). Как упоминал @leviathan, [selectItemAtIndexPath:animated:scrollPosition:] не будет вызывать метод делегата, поэтому есть лучшие способы обойти это. - person ppalancica; 21.03.2017

Да, это правильное поведение. Документация для [selectItemAtIndexPath:animated:scrollPosition:] говорит:

Этот метод не вызывает никаких методов делегата, связанных с выбором.

person leviathan    schedule 17.01.2014

Во-первых, вам нужно сделать целевую ячейку видимой, иначе [yourCollectionView cellForItemAtIndexPath:yourIndexPath] всегда возвращает nil.

// scroll to the cell
[yourCollectionView scrollToItemAtIndexPath:yourIndexPath
                           atScrollPosition:UICollectionViewScrollPositionBottom 
                                   animated:NO];

// call delegate method
[self collectionView:yourCollectionView didSelectItemAtIndexPath:yourIndexPath];

// now you have selected the cell and can do anything to it in the delegate method :-) 
person nopopon    schedule 08.12.2013
comment
Моя ячейка всегда видна, но cellForItemAtIndexPath всегда возвращает ноль (даже после вызова scrollToItemAtIndexPath - person Bagusflyer; 19.07.2014