2015-04-25 4 views
0

У меня есть следующий метод init, который работал отлично до Swift 1.2.Должен вызывать назначенный инициализатор суперкласса «UIViewController» в Swift 1.2

init(items: NSArray, views: NSArray, showPageControl: Bool, navBarBackground: UIColor){ 
    super.init() 

В Swift 1.2 строку с super.init() вызывает ошибку:

Must call a designated initializer of the superclass 'UIViewController' 

Проблема заключается в том, что у меня есть только два возможных супер инициализации методы для вызова одной с codec, а другой с a nib. У меня обоих нет доступа к этому методу init.

См. Полный класс here строка ошибки this.

Как исправить метод init, чтобы он работал с Swift 1.2?

class SLPagingViewSwift: UIViewController, UIScrollViewDelegate { 

    init(items: NSArray, views: NSArray, showPageControl: Bool, navBarBackground: UIColor){ 
     super.init() 
     needToShowPageControl    = showPageControl 
     navigationBarView.backgroundColor = navBarBackground 
     isUserInteraction     = true 
     var i: Int      = 0 
     for item in items{ 
      if item.isKindOfClass(UIView.classForCoder()){ 
       var v    = item as UIView 
       var vSize: CGSize = v.isKindOfClass(UILabel.classForCoder()) ? self.getLabelSize(v as UILabel) : v.frame.size 
       var originX  = (self.SCREENSIZE.width/2.0 - vSize.width/2.0) + CGFloat(i * 100) 
       v.frame   = CGRectMake(originX, 8, vSize.width, vSize.height) 
       v.tag    = i 
       var tap   = UITapGestureRecognizer(target: self, action: "tapOnHeader:") 
       v.addGestureRecognizer(tap) 
       v.userInteractionEnabled = true 
       self.navigationBarView.addSubview(v) 
       self.navItems.addObject(v) 
       i++ 
      } 
     } 

     if (views.count > 0){ 
      var controllerKeys = NSMutableArray() 
      i = 0 
      for controller in views{ 
       if controller.isKindOfClass(UIView.classForCoder()){ 
        var ctr = controller as UIView 
        ctr.tag = i 
        controllerKeys.addObject(NSNumber(integer: i)) 
       } 
       else if controller.isKindOfClass(UIViewController.classForCoder()){ 
        var ctr  = controller as UIViewController 
        ctr.view.tag = i 
        controllerKeys.addObject(NSNumber(integer: i)) 
       } 
       i++ 
      } 

      if controllerKeys.count == views.count { 
       self.viewControllers = NSDictionary(objects: views, forKeys: controllerKeys) 
      } 
      else{ 
       var exc = NSException(name: "View Controllers error", reason: "Some objects in viewControllers are not kind of UIViewController!", userInfo: nil) 
       exc.raise() 
      } 
     } 
    } 

} 

Full Code

+0

Это для SLPagingViewSwift? Я обновил super.init() до super.init (nibName: nil, bundle: nil) –

ответ

2

Вы пишете класс вид контроллера для других людей, чтобы использовать как часть своего собственного приложения. Если бы этот контроллер представления мог иметь файл nib, то то, что вы делаете, было бы неправильным и всегда было бы неправильным: вам было бы разрешено, чтобы вызывающий мог указать имя файла nib в качестве одного из параметров вашего инициализатор, чтобы вы могли позвонить init(nibName:bundle:) и передать это значение.

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

Поэтому вы должны позвонить init(nibName:bundle:), и поскольку в этом контроллере представления нет файла nib, просто передайте nil для имени ниба. Фактически это то, что делал super.init() в более ранней версии Swift - он вызывал init(nibName:bundle:) с nil значениями для вас. Поэтому ничего не потеряно или не изменилось.

+0

Это может помочь вам прочитать объяснение моей книги о том, как контроллер просмотра получает свое представление: http://www.apeth.com/ iOSBook/ch19.html # _view_controller_and_view_creation – matt

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