2016-01-13 4 views
1

Я пытаюсь создать UICollectionView, который должен открыться в определенной ячейке.UICollectionView прокрутите до определенной ячейки

Мой подход заключается в хранении всех клеток:

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> 
     UICollectionViewCell { 
    // my code 
    cells.append(cell) 
    return cell 
} 

затем найти нужную ячейку в viewDidAppear:

let result:[MyCell] = cells.filter{ $0.myProperty!.uuid == selectedUUID } 

К сожалению желаемая клетка не может быть найден в массиве ячеек, потому что не все ячейки сохраняются.

Я иду в правильном направлении или мне нужно другое решение?

EDIT: убрана в заблуждение информации

ответ

3

Не работайте с самим сотой.

В ваших ячейках отображаются данные, не так ли? Они должны.Эти данные (могут быть номерами, текстом или изображением, все) должны быть настраиваемым объектом.

Например, вы показываете список животных.

Так у вас есть Animal класса, с различными свойствами (Size, weight, age). Опять же, весь пример. Возможно, вы показываете список студентов, у которых есть FirstName, Lastname и т. Д. Допустим, мы используем Animal.

У вас есть массив объектов Animal, у вас может быть 1 или 4 или 234234, это не имеет значения. Массив может содержать столько животных, сколько вы хотите. Но у вас есть только один массив.

Для просмотра вашей коллекции (или таблицы) необходимо создать ячейку для каждой строки. Сколько строк ?! Легко, другие методы говорят нам, что существует определенное количество строк в каждом разделе. Допустим, у нас есть только один раздел.

Как вы определяете строки? Вы даете ему номер. Какой номер? Количество животных в вашем массиве. Например, 5. Или, намного лучше, myAnimalsArray.Count. Теперь, если у вас 20 животных, у вас будет 20 ячеек. Если у вас 3 животных, у вас будет 3 клетки.

Хорошо, теперь к ячейкам вы знаете, сколько у вас есть, и cellForRow создаст X-ячейки, X будет подсчетом вашего массива.

Вы, вероятно, имеют простую клетку для тестирования, как

cell.title = animal.name 

, а затем вернуться в клетку. Здесь все псевдо-код, но вы получаете эту идею.

Теперь ваш фактический вопрос

Я написал все потому, что, в соответствии с вашими другими комментариями в другие ответы, вы, кажется, довольно смущенным.

У вас есть ваш массив животных (данные), и пока нет ячеек. Вы хотите начать с животного, у которого есть имя, начинающееся с E, например. Ну, после того, как у вас есть все животные в массиве, вам нужно найти ту, которая начинается с E (или любого другого фильтра, который вам может понравиться). Вы найдете его с помощью метода поиска. После его завершения вы узнаете индекс животного в массиве. Это элемент массива номер 23, это слон.

Создайте объект NSIndexPath с разделом 0 и индексом 23 (потому что ваш фильтр нашел 23-й элемент, опять же, я просто использую примеры), и передайте этот объект indexPath на scroll method of the collectionview.

И вы хорошо;)

ли, что в ViewDidLayoutSubviews или viewDidAppear. (сначала лучше). Но вы должны это сделать после ваш массив животных загружен, иначе у вас не будет данных для фильтрации.

После того, как вы вызвали метод в ссылке выше, ваш просмотр коллекции будет прокручиваться, и если вы сделали это достаточно быстро, он будет загружаться с этим индексом, а не с нулевым индексом.

+0

Благодарим вас за подробное объяснение. Были и другие проблемы, но я сам создал собственный индекс, чтобы использовать его в 'scrollToItemAtIndexPath'. – Mathias

+0

Активирован для этой части. Создайте объект NSIndexPath с разделом 0 и индексом 23 (потому что ваш фильтр нашел 23-й элемент, опять же, я просто использую примеры) и передаю этот объект indexPath методу прокрутки коллекции. – Gandalf458

0

В вашем случае, вам нужно отфильтровать массив данных вместо фильтрации элементов массива, таким образом, вы можете получить точный индекс.

На основе filteredIndex создания indexpath с использованием метода ниже,

NSIndexPath(forItem: filteredIndex, inSection: yourSectionIndex) 

Таким образом, вы можете перейти к конкретной ячейке.

+0

Извините, мое описание не было ясно. Чтобы найти индекс, мне нужно сначала найти ячейку, которой я не мог. Однако как я могу получить доступ к «данным»? – Mathias

1

я решил эту проблему с помощью этого кода надеюсь, что это будет полезно для вас:

[self.collectionview setContentOffset:CGPointMake(0,self.collectionview.contentSize.height-self.collectionview.frame.size.height/2) animated:YES]; 

набор выше единственного параметра для contentsize:CGSizemake(x,y);

, регулируя нужный вам параметр можно прокручивать в определенную ячейку. просто замените выше параметр inplace c и y в методе contentsize:CGSizemake(x,y);.

и вам нужно настроить параметр.

+0

Извините, мое описание не было ясно. Чтобы найти индекс, мне нужно сначала найти ячейку, которой я не мог. – Mathias

0

Попробуйте добавить звонок в collectionView.reloadData() перед scrollToItemAtIndexPath. Это обеспечит создание всех необходимых ячеек.

+0

Извините, мое описание не было ясно. Чтобы найти индекс, мне нужно сначала найти ячейку, которой я не мог. 'collectionView.reloadData()' перед поиском ячеек не создавал все ячейки, было только одно. – Mathias

0

UICollectionView's cell is reused.
Например, если представление может отображать только 3 ячейки один раз: A, B, C; то ур-ячейки могут быть похожими на [A, B, C, A, B, C, A, B, ...];

каждый раз, u задает свойство ячейки, uuid будет сброшен на новое значение. , так что вы не можете отфильтровать, что хотите. Hitendra Hckr прав, u должен «фильтровать массив данных вместо фильтрации массива ячеек».

Или у можете "Alloc" новая клетка вместо "dequeueReusableCellWithReuseIdentifier: forIndexPath:". (Не рекомендуется)

+0

Хорошо, спасибо. Как я могу получить доступ к «данным»? – Mathias

+0

U может сохранять со словарем, например ** index -> uuid **, затем сгруппировать ключи (можно сортировать) словаря, сравнить значение и сохранить его в массиве. – Justlike

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