Пользовательский класс UIPageControl - найдено нулевое изменение изображения до точек

Мне нужно реализовать UIPageControl с пользовательскими изображениями вместо обычной точки. Поэтому я создаю собственный класс и подключаю его через раскадровку. Начиная с ios7 подвид UIPageControl содержит UIView вместо UIImageView. Подвиды результирующих UIView(UIIpageControl подвидов) не содержат подзаголовков, поэтому я получаю сообщение об ошибке:

Неустранимая ошибка: неожиданно найдено nil при развертывании необязательного значения.

Где я мог ошибиться?

class WhitePageControl:UIPageControl{
   let activeImage = UIImage(named: "dot_white")
   let inactiveImage = UIImage(named: "dot_white_e")

   override init(frame: CGRect){
     super.init(frame: frame)
   }

   required init(coder aDecoder: NSCoder){
     super.init(coder: aDecoder)
   }

   func updateDots(){
     println(self.subviews.count) // 3
     println(self.numberOfPages) // 3
     for var index = 0; index < self.subviews.count; index++ {
        println(index)
        var dot:UIImageView!
        var dotView:UIView = self.subviews[index] as UIView
        println("1")
        for subview in dotView.subviews{ // NIL HERE
            println("2")
            if subview.isKindOfClass(UIImageView){
                println("3")
                dot = subview as UIImageView
                if index == self.currentPage{ dot.image = activeImage }
                else{ dot.image = inactiveImage }
            }
            }
         }
       }

    func setCurrentPage(value:Int){
        super.currentPage = value
        self.updateDots()
    }
}

person Marco    schedule 14.01.2015    source источник
comment
Вы нашли какое-нибудь решение?   -  person Abhishek    schedule 30.04.2015


Ответы (2)


Это мое решение:

import Foundation

class PageControl: UIPageControl {
    var activeImage: UIImage!
    var inactiveImage: UIImage!
    override var currentPage: Int {
        //willSet {
        didSet { //so updates will take place after page changed
            self.updateDots()
        }
    }

    convenience init(activeImage: UIImage, inactiveImage: UIImage) {
        self.init()

        self.activeImage = activeImage
        self.inactiveImage = inactiveImage

        self.pageIndicatorTintColor = UIColor.clearColor()
        self.currentPageIndicatorTintColor = UIColor.clearColor()
    }

    func updateDots() {
        for var i = 0; i < count(subviews); i++ {
            var view: UIView = subviews[i] as! UIView
            if count(view.subviews) == 0 {
                self.addImageViewOnDotView(view, imageSize: activeImage.size)
            }
            var imageView: UIImageView = view.subviews.first as! UIImageView
            imageView.image = self.currentPage == i ? activeImage : inactiveImage
        }
    }

    // MARK: - Private

    func addImageViewOnDotView(view: UIView, imageSize: CGSize) {
        var frame = view.frame
        frame.origin = CGPointZero
        frame.size = imageSize

        var imageView = UIImageView(frame: frame)
        imageView.contentMode = UIViewContentMode.Center
        view.addSubview(imageView)
    }

}
person Ilya    schedule 28.05.2015
comment
при прокрутке self.currentPage неправильно. Я прокручиваю страницу 1, но self.currentPage по-прежнему 0 - person lee; 31.07.2015
comment
что бы вы предложили для управления страницей с пользовательским UIView с ImageView и Label в качестве номеров страниц? Это возможно? - person Rhenz; 11.08.2016
comment
У меня тоже сработало... Спасибо. Я изменил его (@IBDesignable), чтобы использовать в раскадровке. Работает отлично :-) - person James Laurenstin; 07.10.2016
comment
@JamesLaurenstin, пожалуйста, поделитесь им здесь (@IBDesignable) - person CAN; 17.11.2016

измените setCurrentPage на Current Page, потому что это свойство Obj C

 func currentPage(page: Int) {
    super.currentPage = page
    self.updateDots()
}

попробуй это.

person learnig kid    schedule 21.07.2016