Frage Schwerer ios Swift-Fehler: Verwendung des nicht implementierten Initialisierers 'init ()'


Ich habe mich sehr angestrengt, jede ähnliche Frage zu StackOverflow nachgeschlagen und vergeblich versucht.

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)

}

Zur Klarstellung verfügt timelineTableViewController über eine Klasse, die MessageTableCell erbt. Es ist auch Teil eines Projekts, das ich in Objective-C-Code integriert habe, also eine Kombination aus Swift und ObjC. Ich habe beide Projekte (das schnelle und das ObjC) unabhängig voneinander durchgeführt und sie funktionieren gut; es ist nur, wenn ich versuche, es zusammen zu tun, machen sie durcheinander. Irgendwelche Vorschläge? Ich habe einen großen Verlust dafür.


19
2018-01-28 07:58


Ursprung


Antworten:


"Im Gegensatz zu Unterklassen in Objective-C erben Swift-Unterklassen ihre Superklassen-Initialisierer standardmäßig nicht."

Automatische Initialisierungsvererbung

  • Regel 1: Wenn Ihre Unterklasse keine designierten Initialisierer definiert, erbt sie automatisch alle Initiatoren, die als Superklassen bezeichnet werden.
  • Regel 2: Wenn Ihre Unterklasse eine Implementierung aller als Superklasse bezeichneten Initialisierer bereitstellt (entweder durch Vererbung gemäß Regel 1 oder durch Bereitstellung einer benutzerdefinierten Implementierung als Teil ihrer Definition), erbt sie automatisch alle Superclass-Convenience-Initialisierer.

Auszug aus: Apple Inc. "Die schnelle Programmiersprache." IBooks. https://itun.es/tw/jEUH0.l

Da Sie das überschreiben init(coder aDecoder: NSCoder), TimeLineTableViewController werde nicht haben init() Initiator.

Sie können eine Implementierung aller Initiatoren dieser Superklasse wie folgt bereitstellen

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

oder löschen Sie einfach die Implementierung von init(coder aDecoder: NSCoder).


40
2018-01-28 08:27