2016-08-16 2 views
0

У меня возникла ситуация с UIPageControl, встроенным в мой UICollectionView. На каждой странице есть собственная назначенная страница, которую я разделил на ячейки коллекции. Когда я перебираю вторую страницу, индикатор управления страницей остается на 1, и когда я сажусь на третью страницу, он правильно обновляется до третьего индикатора. Когда я сажусь, вернемся к странице 2, на странице управления теперь отображается правильный индикатор. Это происходит каждый раз, только для 2-й страницы.Почему мой uipagecontrol не обновляется правильно в первый раз, но во второй раз через Xcode

Вот некоторые из моего кода:

На главном контроллере с точки зрения сбора,

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("cellId", forIndexPath: indexPath) as! ItemImageCell 

    if let imageURL = self.featuredItem.itemImageNames { 
     cell.itemImageURL = imageURL[indexPath.item] 
     cell.pageControl.currentPage = indexPath.item 
     cell.pageControl.numberOfPages = imageURL.count 
    } 
    return cell 
} 

А в классе cellView,

let pageControl: UIPageControl = { 
    let pageControl = UIPageControl() 
    pageControl.pageIndicatorTintColor = UIColor.grayColor() 
    pageControl.currentPageIndicatorTintColor = UIColor.blackColor() 
    return pageControl 
}() 

override func setupViews() { 
    backgroundColor = UIColor.whiteColor() 
    addSubview(pageControl) 

    addConstraint(NSLayoutConstraint(item: pageControl, attribute: .CenterX, relatedBy: .Equal, toItem: self, attribute: .CenterX, multiplier: 1, constant: 0)) 

} 

Am Я не устанавливая его правильно?

Edit:

featuredItem модель класса:

class FeaturedItem: NSObject { 

    var itemImageNames: [String]? 
    var itemTitle: String? 
    var itemHighlight: String? 
    var itemDescription: String? 
    var itemURL: String? 


} 
+0

Возможно ли, что условное 'let' не верно? то есть. Может ли 'self.featuredItem.itemImageNames' быть nil? Вы загружаете это в фоновом режиме или таком? – Paulw11

+0

Привет, Paulw11, featuredItem загружается через парсер json. Разбор заполняет информацию в featuredItem, включая массив String itemImageNames. При загрузке страницы featuredItem.itemImages имеет значение nil, заданное как необязательное в объекте модели. Я добавил код для просмотра. –

ответ

0

Так как ваш self.featuredItem.itemImageNames первоначально может быть нулевым, контрольная страница не может быть установлен правильно. Вы можете попробовать перезагрузить просмотр коллекции после перезагрузки данных.

Однако метод источника данных cellForItemAtIndexPath, вероятно, является плохим местом для обновления индикатора страницы; он вызывается, когда просмотр коллекции требует ячейки, не обязательно, когда он отображает ячейку. Его можно вызвать до того, как пользователь прокрутит, чтобы предварительно выбрать ячейку, или она не может быть вызвана, когда пользователь прокручивает, если в представлении коллекции уже есть кеш-память (например, быстрый прокрутка влево/вправо/влево).

Вы должны обновить индикатор страницы в методе делегата willDisplayCell:forItemAtIndexPath:

func collectionView(collectionView: UICollectionView, 
     willDisplayCell cell: UICollectionViewCell, 
     forItemAtIndexPath indexPath: NSIndexPath) { 

     guard let myCell = cell as? ItemImageCell, 
        imageURL = self.featuredItem.itemImageNames else { 
      return 
     } 
     myCell.pageControl.currentPage = indexPath.item 
     myCell.pageControl.numberOfPages = imageURL.count 
} 
+0

Спасибо за это предложение, я думаю, что это сработает, но функция возвращает UICollectionViewCell, тогда как я создал пользовательскую ячейку под названием ItemImageCell. Есть ли способ опустить ячейку в мою пользовательскую ячейку? –

+0

Да, см. Мое редактирование – Paulw11

+0

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

0

Я был в состоянии найти решение моей проблемы, в этом другом посте.

Why is not updated currentPage indicator on UIPageControl?

В частности, я изменил свою текущую реализацию cellForItemAtIndexPath к следующему, используя предложение из раствора Paulw11 в:

func collectionView(collectionView: UICollectionView, willDisplayCell cell: UICollectionViewCell, forItemAtIndexPath indexPath: NSIndexPath) { 

    guard let myCell = cell as? ItemImageCell, imageURL = self.featuredItem.itemImageNames else { 
     return 
    } 
    myCell.pageControl.numberOfPages = imageURL.count 
    myCell.pageControl.currentPage = indexPath.item 
} 

и установка NUMBEROFPAGES переменного перед установкой переменной CurrentPage.

+0

Я обновил свой ответ, чтобы включить изменения, внесенные в мой код, извините, что я новый пользователь ... это лучший ответ? –

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