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

标签 ios uitableview swift initialization designated-initializer

我是 swift 的新手,在我的 PlacesTableViewController 类中声明初始化程序时遇到问题。它提示我“从初始化程序返回之前未调用 Super.init”,当我添加 Super.init 时,它提示我:

"Must call a designated initializer of the superclass '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...")
    }
...
}

这是我的另一个名为 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
    }

}

最佳答案

init 困惑是 ObjC <-> Swift 桥接的已知限制。

解决此问题的一种方法是委托(delegate)给 superinit(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")
    }

    // …
}

关于ios - 如何解决 UITableViewController 的指定初始化错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30316021/

相关文章:

iphone - SectionHeader 打开/关闭动画

ios - 使用 PayPal iOS SDK 支付多件商品

iphone - UITableViewController 中的行重新排序

objective-c - '无法使标识符为 <addressCell> 的单元格出列

swift - 具有关联值的枚举元素必须至少有一个关联值

ios - UISplitViewController 委托(delegate)从未调用

ios - MFSideMenu 如何在另一个 ViewController 中加载

swift - 处于编辑模式时的 UITableViewCell 宽度问题

ios - 通过一次滑动手势快速控制多个按钮

swift - UIPageControl 有 tvOS 背景