ios - swift 2.2 : Class 'XX' has no initializers

标签 ios swift uitableview

这个问题可能之前有人问过,但我又问了一遍。因为我找不到解决我问题的方法。我有一个相当简单的类,但在该类上出现此错误。请看下面的代码。

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

我无法确定此错误背后的原因。任何人都可以查看代码并告诉我我出了什么问题吗?我是 Swift 的新手,请原谅我的疏忽。

最佳答案

您的问题是类中的所有属性都需要在 init 中初始化或之前,但需要初始化,您可以修复它,将您的委托(delegate)声明为 Optional

正如@Sultan 在他的评论中所说,您应该始终使用 weak 来实现您的代表引用以避免任何类型的保留循环,因为你需要在你的协议(protocol)中指定它总是由类实现,就像这样:

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?

希望对你有帮助

关于ios - swift 2.2 : Class 'XX' has no initializers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36947092/

相关文章:

ios - 无法在表格 View 单元格中显示来自 App Delegate 的数组数据

ios - iPhone 6 和 6 Plus 响应断点

ios - 为什么我不能在按钮操作中使用 var 值?

ios - viewController 中的 UiTableView - 未调用委托(delegate)和数据源方法

iOS - 设置 - Modal Segue to Table view controller

ios - 如何在 Objective-C 中将对象转换为类

ios - 将我的自定义类存储在 UserDefaults 中,并转换(解析)此 UserDefault 以达到值(Swift 4.2)

ios - Google map 无法在 iOS 中加载

ios - 即使使用不同的单元格样式,UITableViewCell detailTextLabel也不会显示

ios - Swift - UIAlertController 没有显示任何内容