2016-01-25 5 views
1

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

До сих пор, у меня есть этот код:

@IBAction func randomClicked(sender: UIButton) { 
    self.randomItem = Int(arc4random_uniform(UInt32(self.members.count))) 
    dispatch_async(dispatch_get_main_queue(), { 
     self.collectionView.reloadData() 
     self.collectionView.scrollToItemAtIndexPath(NSIndexPath(forRow: self.randomItem, inSection: 0), atScrollPosition: UICollectionViewScrollPosition.CenteredHorizontally, animated: true) 
    }) 
} 

Это выдвигает на первый план ячейки, как я хочу (как я настроил стили в cellForIndexAtItem), однако вид не прокручивать все, я уверен. Я что-то очевидное отсутствует, но я не могу увидеть, что это

Я попытался более простую версию, просто чтобы проверить немного прокрутки:!.

@IBAction func randomClicked(sender: UIButton) { 
     self.collectionView.scrollToItemAtIndexPath(NSIndexPath(forRow: 30, inSection: 0), atScrollPosition: UICollectionViewScrollPosition.CenteredHorizontally, animated: true) 
} 

но опять-таки, нет скроллинг

Обновление: 27 февраля С тех пор я воссоздал весь вид, но проблема все еще сохраняется - без прокрутки! Вот полный код:

import Foundation 
import UIKit 
class GroupViewController : UIViewController, UICollectionViewDelegate, UICollectionViewDataSource { 
    @IBOutlet weak var collectionView: UICollectionView! 
    var random = -1 
    // pick a single random student to scroll to 
    @IBAction func randomClicked(sender: UIButton) { 
     self.random = Int(arc4random_uniform(UInt32(200))) 
     self.collectionView.reloadData() // reloads the visible cells, highlighting the random one 
     self.collectionView.scrollToItemAtIndexPath(NSIndexPath(forItem: self.random, inSection: 0), atScrollPosition: UICollectionViewScrollPosition.CenteredHorizontally, animated: true) 
    } 
    // 200 example cells 
    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
     return 200 
    } 
    // draw the cells 
    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 
     let cell = collectionView.dequeueReusableCellWithReuseIdentifier("myCell", forIndexPath: indexPath) as! MyCollectionViewCell 
     cell.title.text = "Title" 
     cell.subtitle.text = "\(indexPath.row)" 
     cell.title.textColor = UIColor.whiteColor() 
     cell.subtitle.textColor = UIColor.whiteColor() 
     if(random == indexPath.row) { 
      cell.backgroundColor = UIColor.purpleColor() 
     } else { 
      cell.backgroundColor = UIColor.lightGrayColor() 
     } 
     return cell 
    } 
    // 4 columns per row 
    func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize { 
     let size = collectionView.frame.width 
     return CGSize(width: (size/4)-(24/4), height: (size/4)-(24/4)) 
    } 
} 
+0

Почему вы называете 'reloadData' первым? – Wain

+0

Это приводит к перезагрузке ячеек - в cellForIndexAtItem, он проверяет, соответствует ли текущая ячейка случайным образом, и соответствующим образом задает цвет. Возможно, это не лучший способ сделать это (открыть предложения!). Однако, даже без этой строки, он не работает, поэтому я предполагаю, что это не проблема здесь? – Ben

+0

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

ответ

0

Для просмотра коллекции вы бы хотели использовать.

NSIndexPath(forItem: 30, inSection: 0) 

нет, что для табличных видов.

NSIndexPath(forRow: 30, inSection: 0) 
+0

Очень хорошая точка - это не сработало, хотя :( – Ben

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