Ios 必须调用超类的指定初始值设定项';UIViewController';在Swift 1.2中
我有下面的init方法,它在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(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)