【问题标题】:Must call a designated initializer of the superclass 'UIViewController' in Swift 1.2必须在 Swift 1.2 中调用超类“UIViewController”的指定初始化程序
【发布时间】:2015-04-26 08:27:12
【问题描述】:

我有以下在 Swift 1.2 之前完美运行的 init 方法。

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,另一个是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

【问题讨论】:

  • 这是为 SLPagingViewSwift 设计的吗?我将 super.init() 更新为 super.init(nibName: nil, bundle: nil)

标签: ios swift


【解决方案1】:

您正在编写一个视图控制器类,供其他人用作他们自己应用程序的一部分。如果此视图控制器可以有一个 nib 文件,那么您所做的将是错误的,并且总是错误的:您可以允许调用者提供 nib 文件名 作为参数之一 您的初始化程序,以便您可以调用 init(nibName:bundle:) 并传递该值。

但我猜你的视图控制器只是使用默认的空自动视图,所以实际上这不是问题。

因此你要做的是调用init(nibName:bundle:),因为这个视图控制器没有nib文件,只需传递nil作为nib名称。这实际上是 super.init() 在早期版本的 Swift 中所做的事情 - 它为您调用带有 nil 值的 init(nibName:bundle:)。所以没有什么是真正丢失或改变的。

【讨论】:

猜你喜欢
  • 2016-05-10
  • 2014-09-29
  • 2016-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多