Ios 如何解决UITableViewController的指定初始化错误?
我是swift新手,在PlacesTableViewController类中声明初始值设定项时遇到问题。它会提示我“在从初始值设定项返回之前不会调用Super.init”,当我添加Super.init时,它会提示我: “必须调用超类的指定初始值设定项 “UITableViewController” 这是我的PlacesTableViewController.swift文件: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 {
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