![](/img/trans.png)
[英]Must call a designated initializer of the superclass 'UIViewController'
[英]Must call a designated initializer of the superclass 'UIViewController' in Swift 1.2
我有以下init方法,在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
,另一種是使用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文件,因此只需將nil
傳遞給nib名稱即可。 實際上,這就是早期版本的Swift中super.init()
所做的-它正在為您調用帶有nil
值的init(nibName:bundle:)
。 因此,沒有任何東西真正丟失或改變。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.