簡體   English   中英

必須在Swift 1.2中調用超類'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方法都無法訪問。

這里看到完整的類,錯誤所在的行是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()
            }
        }
    }

}

完整代碼

您正在編寫一個視圖控制器類,供其他人用作自己的應用程序。 如果此視圖控制器可以包含一個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM