2015-01-28 15 views
16

Tôi đã cố gắng hết sức, đã tra cứu mọi câu hỏi tương tự liên quan đến vấn đề này trên StackOverflow và cố gắng không có kết quả.ios Lỗi gây tử vong nhanh chóng: sử dụng trình khởi tạo chưa thực hiện '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) 

} 

Để làm rõ, timelineTableViewController có một lớp kế thừa, MessageTableCell. Nó cũng là một phần của một dự án mà tôi đã tích hợp vào mã Objective-C, vì vậy nó là sự kết hợp của cả Swift và ObjC. Tôi đã chạy cả hai dự án (một trong những nhanh chóng và ObjC một) độc lập và họ làm việc tốt; chỉ khi tôi cố gắng chạy nó cùng nhau thì họ mới làm hỏng. Bất kỳ đề xuất? Tôi đang thua lỗ hoàn toàn.

Trả lời

35

“Không giống như các lớp con trong Objective-C, lớp con Swift không kế thừa initializers lớp cha của họ theo mặc định.”

Automatic Initializer Inheritance

  • Quy tắc 1: Nếu lớp con của bạn không' t xác định bất kỳ initializers được chỉ định, nó tự động kế thừa tất cả các superclass được chỉ định của nó initializers.
  • Quy tắc 2: Nếu phân lớp của bạn cung cấp triển khai tất cả các trình khởi tạo được chỉ định của siêu lớp hoặc bằng cách kế thừa chúng theo quy tắc 1 hoặc bằng cách cung cấp triển khai tùy chỉnh như một phần trong định nghĩa của nó các trình khởi tạo thuận tiện của lớp cha.

Trích: Apple Inc. "Ngôn ngữ lập trình Swift". IBooks. https://itun.es/tw/jEUH0.l

Vì bạn đã ghi đè init(coder aDecoder: NSCoder), TimeLineTableViewController sẽ không có init() initiailzer.

Bạn có thể cung cấp một thực hiện tất cả các lớp cha initialisers định của nó như thế này

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

, hoặc chỉ cần xóa thi hành init(coder aDecoder: NSCoder).

+0

Xin chào, tôi đã thử sử dụng đề xuất cuối cùng 'xóa triển khai init (coder aDecoder: NSCoder) nhưng khi tôi đã làm, nó có lỗi. Bạn có nghĩa là trong các lớp khác? Đó là TimelineTableViewController -> MessageTableViewCell. – Tam

+0

Hi @Tam, bạn đã triển khai bất kỳ bộ khởi tạo nào trong 'TimelineTableViewController' hoặc trong' MessageTableViewCell' và chúng không làm gì ngoài việc chỉ gọi trình khởi tạo của siêu? Bạn không cần phải ghi đè bất kỳ trình khởi tạo nào trừ khi bạn có một số initiailzation tùy chỉnh phải được thực hiện khi khởi tạo. –

+0

Tôi đã thêm mã bạn đã có cho cả hai. Có MessageTableViewCell cần một cái gì đó khác nhau? Ngoài ra, tôi có một segue push đến một UIViewController gọi là ComposeViewController. Mã ban đầu hoạt động trong cả ba (ngoại trừ MessageTableViewCell, nơi tôi không bao gồm nó) trong dự án ban đầu nhưng không phải là dự án kết hợp. – Tam

Các vấn đề liên quan