Ios 如何解决UITableViewController的指定初始化错误?

Ios 如何解决UITableViewController的指定初始化错误?,ios,uitableview,swift,initialization,designated-initializer,Ios,Uitableview,Swift,Initialization,Designated Initializer,我是swift新手,在PlacesTableViewController类中声明初始值设定项时遇到问题。它会提示我“在从初始值设定项返回之前不会调用Super.init”,当我添加Super.init时,它会提示我: “必须调用超类的指定初始值设定项 “UITableViewController” 这是我的PlacesTableViewController.swift文件: class PlacesTableViewController: UITableViewController {

我是swift新手,在PlacesTableViewController类中声明初始值设定项时遇到问题。它会提示我“在从初始值设定项返回之前不会调用Super.init”,当我添加Super.init时,它会提示我:

“必须调用超类的指定初始值设定项 “UITableViewController”

这是我的PlacesTableViewController.swift文件:

class PlacesTableViewController: UITableViewController { 

    var pa55DB : COpaquePointer = nil
    var selectStatement : COpaquePointer = nil;

    var chapterdata : Array<Entry> = []
    var ety : Entry
    var sqlString : String = "";

    var chpData : ChapterData

    init(pa55DB : COpaquePointer,selectStatement : COpaquePointer, chapterdata : Array<Entry>, ety : Entry, sqlString : String) {
        super.init()
        self.pa55DB = pa55DB
        self.selectStatement = selectStatement
        self.chapterdata = chapterdata
        self.ety = ety
        self.sqlString = sqlString

    }

    required init!(coder aDecoder: NSCoder!) {
        fatalError("init(coder:) has not been implemented")
    }


    override func viewDidLoad() {
        super.viewDidLoad()

        chpData = ChapterData(newEntryArray : chapterdata, entryV : ety, paDB55 : pa55DB, selectStatement : selectStatement, sqlString : sqlString)
        chpData.openDB()
        chapterdata = chpData.prepareStartment()

        println("Testing...")
    }
...
}
class PlacesTableViewController:UITableViewController{
var pa55DB:COpaquePointer=nil
var selectStatement:copaquepenter=nil;
var chapterdata:Array=[]
变量ety:条目
var-sqlString:String=“”;
var chpData:章数据
init(pa55DB:COpaquePointer,selectStatement:COpaquePointer,chapterdata:Array,ety:Entry,sqlString:String){
super.init()
self.pa55DB=pa55DB
self.selectStatement=selectStatement
self.chapterdata=chapterdata
self.ety=ety
self.sqlString=sqlString
}
必需的初始化!(编码者aDecoder:NSCoder!){
fatalError(“初始化(编码者:)尚未实现”)
}
重写func viewDidLoad(){
super.viewDidLoad()
chpData=ChapterData(newEntryArray:ChapterData,entryV:ety,paDB55:pa55DB,selectStatement:selectStatement,sqlString:sqlString)
chpData.openDB()
chapterdata=chpData.prepareStartment()
println(“测试…”)
}
...
}
这是我的另一个类文件ChapterData.swift,用于打开数据库和检索数据

class Entry {

    let image : String!
    let heading : String!
    let title : String!
    let description : String!
    public init(image : String, heading : String, title : String, desc : String) {
        self.heading = heading
        self.image = image
        self.title = title
        self.description = desc
    }
}


class ChapterData {

    var paDB : COpaquePointer = nil;
    var selectStatement : COpaquePointer = nil;
    var sqlString : String = "";

    var newEntryArray : Array<Entry> = [];
    var entryV : Entry;

    init(newEntryArray : Array<Entry>, entryV : Entry, paDB55 : COpaquePointer, selectStatement : COpaquePointer, sqlString : String){
        self.newEntryArray = newEntryArray
        self.entryV = entryV
        self.paDB = paDB55
        self.selectStatement = selectStatement
        self.sqlString = sqlString
    }

    func openDB() {
        var paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as! String
        var docsDir = paths.stringByAppendingPathComponent("pa55.sqlite")


        if (sqlite3_open(docsDir, &paDB) == SQLITE_OK) {
            println("success open database")
        }
        else {
            println("failed to open database")
        }
    }

    func prepareStartment() -> Array<Entry>   {
        sqlString = "SELECT * FROM Chapter ORDER BY CID ASC"
        var cSql = sqlString.cStringUsingEncoding(NSUTF8StringEncoding)
        sqlite3_prepare_v2(paDB, cSql!, -1, &selectStatement, nil)

        println("startment start")

        while (sqlite3_step(selectStatement) == SQLITE_ROW) {

            let image_buf = sqlite3_column_text(selectStatement, 3)
            var image = String.fromCString(UnsafePointer<CChar>(image_buf))

            let heading_buf = sqlite3_column_text(selectStatement, 1)
            var heading = String.fromCString(UnsafePointer<CChar>(heading_buf))

            let title_buf = sqlite3_column_text(selectStatement, 2)
            var title = String.fromCString(UnsafePointer<CChar>(title_buf))

            let desc_buf = sqlite3_column_text(selectStatement, 4)
            var description = String.fromCString(UnsafePointer<CChar>(desc_buf))

            entryV = Entry(image: image!, heading: heading!, title: title!, desc: description!)
            newEntryArray.append(entryV)
        }
        println("select statement successful executed")
        return newEntryArray
    }

}
类条目{
让图像:字符串!
让标题:字符串!
让标题:字符串!
让我们描述:字符串!
public init(图像:String,标题:String,标题:String,描述:String){
self.heading=航向
self.image=image
self.title=标题
self.description=desc
}
}
类章数据{
var paDB:copaquepeninter=nil;
var selectStatement:copaquepenter=nil;
var-sqlString:String=“”;
var newEntryArray:Array=[];
var entryV:条目;
init(newEntryArray:Array,entryV:Entry,paDB55:copaquepInter,selectStatement:copaquepInter,sqlString:String){
self.newEntryArray=newEntryArray
self.entryV=entryV
self.paDB=paDB55
self.selectStatement=selectStatement
self.sqlString=sqlString
}
func openDB(){
var path=NSSearchPathForDirectoriesInDomains(.DocumentDirectory、.UserDomainMask,true)[0]作为!字符串
var docsDir=path.stringByAppendingPathComponent(“pa55.sqlite”)
如果(sqlite3_打开(docsDir和paDB)=SQLITE_正常){
println(“成功打开数据库”)
}
否则{
println(“打开数据库失败”)
}
}
func prepareStart()->数组{
sqlString=“按CID ASC从章节顺序中选择*”
var cSql=sqlString.cStringUsingEncoding(NSUTF8StringEncoding)
sqlite3\u prepare\u v2(paDB,cSql!,-1,&selectStatement,nil)
println(“启动”)
while(sqlite3\u步骤(selectStatement)=SQLITE\u行){
让image\u buf=sqlite3\u column\u text(selectStatement,3)
var image=String.fromCString(UnsafePointer(image_buf))
让标题\u buf=sqlite3\u列\u文本(selectStatement,1)
var heading=String.fromCString(UnsafePointer(heading_buf))
让title\u buf=sqlite3\u column\u text(selectStatement,2)
var title=String.fromCString(UnsafePointer(title\u buf))
让desc\u buf=sqlite3\u column\u text(selectStatement,4)
var description=String.fromCString(未安全指针(desc_buf))
entryV=Entry(图像:图像!、标题:标题!、标题:标题!、描述:描述!)
newEntryArray.append(entryV)
}
println(“select语句成功执行”)
返回newEntryArray
}
}

看看这是否能解决您的问题:

override init(style: UITableViewStyle) {
    super.init(style: style)
}

init(pa55DB : COpaquePointer,selectStatement : COpaquePointer, chapterdata : Array<Entry>, ety : Entry, sqlString : String) {
    super.init(style: UITableView.Style.plain)
    self.pa55DB = pa55DB
    self.selectStatement = selectStatement
    self.chapterdata = chapterdata
    self.ety = ety
    self.sqlString = sqlString

}
override init(样式:UITableViewStyle){
super.init(样式:style)
}
init(pa55DB:COpaquePointer,selectStatement:COpaquePointer,chapterdata:Array,ety:Entry,sqlString:String){
super.init(样式:UITableView.style.plain)
self.pa55DB=pa55DB
self.selectStatement=selectStatement
self.chapterdata=chapterdata
self.ety=ety
self.sqlString=sqlString
}

从Swift编程语言指南:

指定的初始值设定项是类的主要初始值设定项。A. 指定的初始值设定项完全初始化由 并调用相应的超类初始值设定项以继续 超类链上的初始化过程


更新:


上面的代码实际上通过指定的初始值设定项解决了这个问题。现在需要正确初始化self.ety属性。

已知ObjC Swift桥接的限制是
init
mess

解决这个问题的一种方法是委托给
super
init(nibName:bundle:)
初始值设定项

class PlacesTableViewController: UITableViewController { 

    var chapterdata: [Entry]
    var chpData: ChapterData?
    var ety: Entry
    var pa55DB: COpaquePointer
    var selectStatement: COpaquePointer
    var sqlString: String


    init(pa55DB: COpaquePointer, selectStatement: COpaquePointer, chapterdata: [Entry], ety: Entry, sqlString: String) {
        self.pa55DB = pa55DB
        self.selectStatement = selectStatement
        self.chapterdata = chapterdata
        self.ety = ety
        self.sqlString = sqlString

        super.init(nibName: nil, bundle: nil)
    }


    required init(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    // …
}

也许可以试试这样:

class PlacesTableViewController: UITableViewController { 

   var chapterdata: [Entry]
   var chpData: ChapterData?
   var ety: Entry
   var pa55DB: COpaquePointer
   var selectStatement: COpaquePointer
   var sqlString: String


   convenience init(pa55DB: COpaquePointer, selectStatement: COpaquePointer, chapterdata: [Entry], ety: Entry, sqlString: String) {
       self.init()

       self.pa55DB = pa55DB
       self.selectStatement = selectStatement
       self.chapterdata = chapterdata
       self.ety = ety
       self.sqlString = sqlString

   }

   required init(coder aDecoder: NSCoder) {
       super.init(coder: aDecoder)
   }

   // …
}
class PlacesTableViewController: UIViewController {

    let tableView = UITableView(frame: CGRectZero, style: .Plain)

    override func loadView() {
        view = tableView
    }

    // Custom designated initializer
    init(pa55DB : COpaquePointer,selectStatement : COpaquePointer, chapterdata : Array<Entry>, ety : Entry, sqlString : String) {
        // setting up these properties
        super.init(nibName: nil, bundle: nil)  // designated initializer of the superclass 'UIViewController'"
    }
}

UITableViewController对于高级用例来说不是什么好东西。您始终可以将
UIViewController
子类化,并在其中放置
UITableView
属性,如下所示:

class PlacesTableViewController: UITableViewController { 

   var chapterdata: [Entry]
   var chpData: ChapterData?
   var ety: Entry
   var pa55DB: COpaquePointer
   var selectStatement: COpaquePointer
   var sqlString: String


   convenience init(pa55DB: COpaquePointer, selectStatement: COpaquePointer, chapterdata: [Entry], ety: Entry, sqlString: String) {
       self.init()

       self.pa55DB = pa55DB
       self.selectStatement = selectStatement
       self.chapterdata = chapterdata
       self.ety = ety
       self.sqlString = sqlString

   }

   required init(coder aDecoder: NSCoder) {
       super.init(coder: aDecoder)
   }

   // …
}
class PlacesTableViewController: UIViewController {

    let tableView = UITableView(frame: CGRectZero, style: .Plain)

    override func loadView() {
        view = tableView
    }

    // Custom designated initializer
    init(pa55DB : COpaquePointer,selectStatement : COpaquePointer, chapterdata : Array<Entry>, ety : Entry, sqlString : String) {
        // setting up these properties
        super.init(nibName: nil, bundle: nil)  // designated initializer of the superclass 'UIViewController'"
    }
}
类PlacesTableViewController:UIViewController{
让tableView=UITableView(帧:CGRectZero,样式:.Plain)
重写func loadView(){
视图=表格视图
}
//自定义指定初始值设定项
init(pa55DB:COpaquePointer,selectStatement:COpaquePointer,chapterdata:Array,ety:Entry,sqlString:String){
//设置这些属性
super.init(nibName:nil,bundle:nil)//超类“UIViewController”的指定初始值设定项
}
}
它的工作原理类似于
UITableViewController

其他实用程序
UITableViewCont