我是swift的新手,我在我的placestleviewcontroller类中声明我的初始化器有问题。它提示我"超级。"init在从初始化器返回之前不会被调用"当我添加Super时。Init,它提示我:
"必须调用父类的指定初始化式UITableViewController"
这是我的placestleviewcontroller .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桥接的已知限制。
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")
}
// …
}
看看这是否能解决你的问题:
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
}
UITableView Class Reference
来自Swift编程语言指南:
(了解更多)指定初始化式是类的主初始化式。一个引入的所有属性完全初始化该类并调用适当的超类初始化项以继续在超类链上的初始化过程。
更新:
上面的代码实际上解决了指定初始化器的问题。现在需要正确地初始化self。表"状态"属性。
可以试试这样做:
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)
}
// …
}
UITableViewController并不适合高级用例。您始终可以子类化UIViewController
并在其中添加UITableView
属性,就像这样:
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
一样。
UITableViewController
提供的其他实用程序,如refreshControl
,您也可以为自己设置一个,如clearsSelectionOnViewWillAppear
机制也可以在viewWillAppear()
或didSelectRowAtIndexPath
中实现,具体取决于您的需要。