Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/115.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 必须调用超类的指定初始值设定项';UIViewController';在Swift 1.2中_Ios_Swift - Fatal编程技术网

Ios 必须调用超类的指定初始值设定项';UIViewController';在Swift 1.2中

Ios 必须调用超类的指定初始值设定项';UIViewController';在Swift 1.2中,ios,swift,Ios,Swift,我有下面的init方法,它在Swift 1.2之前工作得非常好 init(items: NSArray, views: NSArray, showPageControl: Bool, navBarBackground: UIColor){ super.init() 在Swift 1.2中,带有的行引发错误: Must call a designated initializer of the superclass 'UIViewController' 问题是我只有两个可能的超级init方法

我有下面的init方法,它在Swift 1.2之前工作得非常好

init(items: NSArray, views: NSArray, showPageControl: Bool, navBarBackground: UIColor){
  super.init()
在Swift 1.2中,带有的行引发错误:

Must call a designated initializer of the superclass 'UIViewController'
问题是我只有两个可能的超级init方法可以调用,一个是使用
编解码器
,另一个是使用
nib
。在这个init方法中,我无法访问这两者

请参见错误所在行的完整类

如何更正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()
            }
        }
    }

}

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

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


因此,您要做的是调用
init(nibName:bundle:)
,由于此视图控制器没有nib文件,只需传递nib名称的
nil
。事实上,这就是早期版本Swift中的
super.init()
所做的工作-它使用
nil
值为您调用
init(nibName:bundle:)
。因此,没有任何东西真正丢失或更改。

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

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


因此,您要做的是调用
init(nibName:bundle:)
,由于此视图控制器没有nib文件,只需传递nib名称的
nil
。事实上,这就是早期版本Swift中的
super.init()
所做的工作-它使用
nil
值为您调用
init(nibName:bundle:)
。因此,没有任何东西真正丢失或更改。

阅读我的书中关于视图控制器如何获取其视图的说明可能会有帮助:阅读我的书中关于视图控制器如何获取其视图的说明:这是为SLPagingViewSwift准备的吗?我将super.init()更新为super.init(nibName:nil,bundle:nil)这是用于SLPagingViewSwift的吗?我将super.init()更新为super.init(nibName:nil,bundle:nil)