2

Я новичок в быстрой работе, и у меня возникают проблемы с объявлением моего инициализатора в моем классе PlacesTableViewController. Это побуждает меня «Super.init не вызывается перед возвращением из инициализаторе», и когда я добавил Super.init, то мне подсказывает:Как разрешить указанную ошибку инициализации для UITableViewController?

"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 
    } 

} 
+0

Правила сложны, но очевидны, как только вы их понимаете. Прочтите книгу языков Swift. Это все объясняет. – gnasher729

+0

Я просмотрел ваш файл, ваша проблема с инициализатором IS разрешена, однако это вызвало еще одну ошибку: свойство «self.et» не инициализировано при вызове super.init. Таким образом, ваш ety: запись должна быть правильно инициализирована. Вероятно, вы должны задать новый вопрос по этому вопросу, так как в обычной практике задавать один вопрос за сообщение. –

+0

Итак, теперь проблема в том, что я просто правильно инициализирую мой ety: Entry, могу ли я продолжить с кодами, которые я поделил с вами (для отладки)? И большое спасибо за вашу помощь. –

ответ

1

Смотрите, если это решит проблему:

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

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

} 

UITableView Class Reference

Из Swift Руководство по программированию Язык:

Designated initializers are the primary initializers for a class. A designated initializer fully initializes all properties introduced by that class and calls an appropriate superclass initializer to continue the initialization process up the superclass chain.

[read more]


Update:

Вышеупомянутый код действительно разрешает проблему с назначенным инициализатором. Теперь вам нужно правильно инициализировать свойство self.ety.

+0

переопределение инициализации (стиль: UITableViewStyle) { } // ошибка: Super.init не вызывается перед возвращением из инициализаторе INIT (pa55DB: COpaquePointer, SelectStatement: COpaquePointer, chapterdata: Array , ETY: Вступление, SqlString : String) { super.init (стиль: UITableViewStyle.Plain) self.pa55DB = pa55DB self.selectStatement = SelectStatement self.chapterdata = chapterdata self.ety = ETY self.sqlString = SqlString } // error на super.init (стиль: UITableViewStyle.Plain) -> Свойство .et 'не инициализирован при вызове super.init –

+0

, вам также нужно будет обновить ваш super.init в вашем инициализаторе, добавьте super.init (style: UITableViewStyle.Plain) в ваш init (pa55DB ... –

+0

извините, но не супер.init (стиль: UITableViewStyle.Plain) уже добавлен в код, который вы показали выше? –

4

init беспорядок - известное ограничение ObjC < -> Быстрое мостовое соединение.

Один из способов обойти это, чтобы делегировать 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") 
    } 

    // … 
} 
+0

Успех моей сборки, однако, когда я запускаю свой проект, возникает фатальная ошибка, говорящая о init (coder :) не был реализован. Тема 1: EXC_BAD_INSTRUCTION (код = EXC_1386_INVOP, subcode = 0x0) –

+0

Вы загружаете контроллер вида из раскадровки или файла nib/xib? Если это так, вам также придется реализовать 'required init (coder: NSCoder) 'должным образом, который в настоящее время не реализован. – fluidsonic

+0

Да, я использую контроллер представления из своей раскадровки. ement требуемый init (coder: NSCoder), есть ли какие-либо ссылки, на которые я могу смотреть, чтобы следовать? –

0

Может быть, попробовать что-то вроде этого:

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) 
    } 

    // … 
} 
-1

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 в зависимости от ваших потребностей.

+0

Что, это одно из худших утверждений, которые я видел в Stackoverflow на сегодняшний день. UITableViewController следует использовать чаще, чем необработанные UITableView. Почему в мире вы бы воссоздали то, что уже сделано. – TheCodingArt

+0

До тех пор пока вы не найдете UITableViewController, это действительно _bad joke_ в Swift и даже _crash_ на iPad iOS 8. https://forums.developer.apple.com/thread/16621 – denkeni

+0

Это проблема инициализации между swift и objc, которая никоим образом не поддерживает ваши плохие требования. Как человек, который в течение многих лет работал в приложениях с пользовательскими базами размером с Uber, я никогда не буду воспринимать вас всерьез, если вы назовите uitableviewcontroller шутки LOL. Для меня это звучит так, как будто вы просто не знаете, как использовать его или иметь слабые архитектурные парадигмы. Кроме того, я рекомендую посмотреть отчеты о проблемах, прежде чем обвинять реализацию класса lol. – TheCodingArt

Смежные вопросы