2016-04-29 18 views
1

おそらくこの質問は以前に聞かれましたが、もう一度聞いています。私の問題の解決策を見つけることができなかったからです。私はこのエラーが発生しているかなり単純なクラスを持っています。コードを見てください。Swift 2.2:クラス 'XX'には初期化子がありません

import UIKit 
import QuartzCore 


protocol AddItemViewControllerDelegate { 
    func addItemViewControllerDidCancel(controller: InsertItemViewController) 
    func addItemViewController(controller: InsertItemViewController, didFinishAddingItem item: ChecklistItem) 
    func addItemViewController(controller: InsertItemViewController, didFinishEditingItem item: ChecklistItem) 
} 


class InsertItemViewController: UITableViewController, UITextFieldDelegate, UITextViewDelegate { 

    @IBOutlet var notesField: UITextView! 

    var notes: String = "" 
    var shouldRemind: Bool = false 
    var dueDate: NSDate = NSDate() 
    var delegate: AddItemViewControllerDelegate 
    var itemToEdit: ChecklistItem { 
     get { 
      return self.itemToEdit 
     } 
     set(newItem) { 
      if itemToEdit != newItem { 
       self.itemToEdit = newItem 
       notes = itemToEdit.notes 
       shouldRemind = itemToEdit.shouldRemind 
       dueDate = itemToEdit.dueDate 
      } 
     } 
    } 
    @IBOutlet var dueDateLabel: UILabel! 
    var activityViewController: UIActivityViewController! 


    convenience required init(coder aDecoder: NSCoder) { 
     self.init(coder: aDecoder) 
     notes = "" 
     shouldRemind = true 
     dueDate = NSDate() 
    } 


    @IBAction func cancel() { 
     self.delegate.addItemViewControllerDidCancel(self) 
    } 

    @IBAction func done() { 
     if self.itemToEdit == "" { 
      let item: ChecklistItem = ChecklistItem() 
      item.notes = self.notesField.text! 
      item.shouldRemind = true 
      item.dueDate = dueDate 
      self.delegate.addItemViewController(self, didFinishAddingItem: item) 
     } 
     else { 
      self.itemToEdit.notes = self.notesField.text! 
      self.itemToEdit.shouldRemind = true 
      self.itemToEdit.dueDate = dueDate 
      self.delegate.addItemViewController(self, didFinishEditingItem: self.itemToEdit) 
     } 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 
      ///wecreate 
     let doneButton: UIBarButtonItem = UIBarButtonItem(barButtonSystemItem: .Done, target: self, action: #selector(InsertItemViewController.done)) 
     self.navigationItem.rightBarButtonItems = [doneButton] 

     if self.itemToEdit.itemId != 0 { 
      self.title = "Edit Note" 
     } 
     else { 
      self.title = "Add Note" 
     } 
     self.notesField.text = notes 
     self.notesField.delegate = self 
    } 

    override func viewWillAppear(animated: Bool) { 
     super.viewWillAppear(animated) 
    } 

    override func scrollViewWillBeginDragging(scrollView: UIScrollView) { 
     self.notesField.resignFirstResponder() 
    } 

    override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { 
     if indexPath.section == 0 { 
      cell.backgroundColor = TableCellBackgroundColor 
     } 
    } 

    override func tableView(tableView: UITableView, willSelectRowAtIndexPath indexPath: NSIndexPath) -> NSIndexPath? { 
     if indexPath.row == 0 { 
      return indexPath 
     } else { 
      return nil; 
     } 
    } 


    func textViewShouldBeginEditing(textView: UITextView) -> Bool { 
     return true 
    } 

    func imageFromLayer(layer: CALayer) -> UIImage { 
     layer.renderInContext(UIGraphicsGetCurrentContext()!) 
     let outputImage: UIImage = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 
     return outputImage 
    } 
} 

このエラーの原因を特定できません。誰もがコードを見て、私が間違っていることを教えてくださいできますか?私はスイフトの新人ですので、私の無視を許してください。

答えて

0

この行のためにこのエラーが発生しています。

var delegate: AddItemViewControllerDelegate 

この行をこれに置き換えます。

var delegate: AddItemViewControllerDelegate! 

ただし、デリゲートを初期化していない場合はクラッシュします。だから、クラッシュを避けるために、以下を使用してください。

var delegate: AddItemViewControllerDelegate? 
+7

代理人は、おそらく '?'ではなく、 '!'でなければなりません。また、ほとんど常に「弱い」ものでなければなりません。 – Sulthan

+0

ありがとう:)すでに回答を編集しました。 –

2

あなたの問題は、クラス内のすべてのプロパティがinit中または前に初期化する必要があるが、初期化する必要があるということである@Sultanが言ったように、あなたはOptional

としてデリゲートを宣言し、それを修正することができます彼のコメントには、常に保持サイクルのあらゆる種類のを避けるためにweakの参照を使用して、デリゲートを実装する、あなたのためには、それは常にこのようにように、クラスで実装され、あなたのプロトコルで指定する必要があることを行う必要があります。

protocol AddItemViewControllerDelegate: class { 
    func addItemViewControllerDidCancel(controller: InsertItemViewController) 
    func addItemViewController(controller: InsertItemViewController, didFinishAddingItem item: ChecklistItem) 
    func addItemViewController(controller: InsertItemViewController, didFinishEditingItem item: ChecklistItem) 
} 

そして、あなたはこのようなあなたのクラスの内部weak参照として宣言することが可能です。

weak var delegate: AddItemViewControllerDelegate? 

私は、これはあなたを助ける願っています。

関連する問題