2015-01-28 17 views
16

Ho cercato molto duramente, ho cercato tutte le domande simili relative a questo problema su StackOverflow e cercando inutilmente.errore irreversibile ios Swift: uso dell'inizializzatore non implementato 'init()'

class TimeLineTableViewController: UITableViewController, 
UIImagePickerControllerDelegate, UINavigationControllerDelegate { 

var timelineData = [PFObject]() 


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

override func viewDidLoad() { 

    super.viewDidLoad() 

    self.loadData()  


} 
@IBAction func loadData(){ 
    timelineData.removeAll(keepCapacity: false) 

    var findTimelineData:PFQuery = PFQuery(className:"timelineMessages") 
    findTimelineData.findObjectsInBackgroundWithBlock 
     { 
      (objects:[AnyObject]! , error:NSError!) -> Void in 
      if error == nil 
      { 
       self.timelineData = objects.reverse() as [PFObject] 


       //let array:NSArray = self.timelineData.reverseObjectEnumerator().allObjects 

       // self.timelineData = array as NSMutableArray 



       self.tableView.reloadData() 
      } 
    } 
} 




override func viewDidAppear(animated: Bool) { 



    var footerView:UIView = UIView(frame: CGRectMake(0, 0, self.view.frame.size.width, 50)) 
    self.tableView.tableFooterView = footerView 

    var logoutButton:UIButton = UIButton.buttonWithType(UIButtonType.System) as UIButton 
    logoutButton.frame = CGRectMake(20, 10, 50, 20) 
    logoutButton.setTitle("Logout", forState: UIControlState.Normal) 
    logoutButton.addTarget(self, action:"logout:", forControlEvents: UIControlEvents.TouchUpInside) 

    footerView.addSubview(logoutButton) 

} 

Per chiarire, timelineTableViewController ha una classe che eredita, MessageTableCell. Fa parte anche di un progetto che ho integrato nel codice Objective-C, quindi è una combinazione di Swift e ObjC. Ho eseguito entrambi i progetti (quello rapido e quello ObjC) in modo indipendente e funzionano bene; è solo quando provo a farlo funzionare insieme. Eventuali suggerimenti? Sono completamente perduto per questo.

risposta

35

“A differenza di sottoclassi in Objective-C, sottoclassi Swift non ereditano i loro initializers superclasse per impostazione predefinita.”

automatico Initializer Inheritance

  • Regola 1: Se la sottoclasse doesn' t definire eventuali inizializzatori designati, eredita automaticamente tutti i suoi inizializzatori designati della superclasse.
  • Regola 2: Se la sottoclasse fornisce un'implementazione di tutte le sue superclasse designato initializers-avviene mediante ereditando come da regola 1, o fornendo un'implementazione personalizzata come parte della sua definizione, allora eredita automaticamente tutti gli inizializzatori di convenienza della superclasse.

Estratto da: Apple Inc. "The Swift Programming Language." IBooks. https://itun.es/tw/jEUH0.l

Dal momento che hai ignorare il init(coder aDecoder: NSCoder), TimeLineTableViewController non avranno il init() initiailzer.

È possibile fornire un'implementazione di tutte le sue inizializzatori designati superclasse come questo

override init() { 
     super.init() 
} 

override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) { 
     super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) 
} 

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

, o semplicemente eliminare l'attuazione di init(coder aDecoder: NSCoder).

+0

Ciao, ho provato a utilizzare l'ultimo suggerimento 'elimina l'implementazione di init (coder aDecoder: NSCoder) ma quando l'ho fatto, ha ottenuto degli errori. Intendevi all'interno di altre classi? È TimelineTableViewController -> MessageTableViewCell. – Tam

+0

Ciao @Tam, hai implementato eventuali inizializzatori in 'TimelineTableViewController' o in' MessageTableViewCell' e non fanno altro che chiamare gli inizializzatori di super? Non è necessario sovrascrivere eventuali inizializzatori a meno che non si disponga di un'inizializzazione personalizzata da eseguire durante l'inizializzazione. –

+0

Ho aggiunto il codice che avevi a entrambi. MessageTableViewCell ha bisogno di qualcosa di diverso? Inoltre, ho un push seguito a un UIViewController chiamato ComposeViewController. Il codice originale funziona in tutti e tre (tranne per MessageTableViewCell, dove non l'ho incluso) nel progetto originale ma non nel progetto combinato. – Tam

Problemi correlati