委托不会在Swift中创建

时间:2016-06-20 16:01:40

标签: ios swift delegates protocols

我正在开展涉及代表协议的快速项目。我有两个文件在这方面运行顺利,但是我遇到了一个问题,代表在不同的两个文件中不断出现nil,我用不同的名称做同样的事情。看起来似乎没有因某种原因设置/创建委托。请参阅以下代码:

ItemDetailViewController

import UIKit

protocol ItemDetailViewControllerDelegate: class {

    func itemDetailViewControllerDidCancel(controller: ItemDetailViewController)
    func itemDetailViewController(controller: ItemDetailViewController, didFinishAddingItem item: ChecklistItem)
    func itemDetailViewController(controller: ItemDetailViewController, didFinishEditingItem item: ChecklistItem)
}

class ItemDetailViewController: UITableViewController, UITextFieldDelegate {

**weak var delegate: ItemDetailViewControllerDelegate?**
@IBOutlet weak var doneBarButton: UIBarButtonItem!
@IBOutlet weak var textField: UITextField!
var itemToEdit: ChecklistItem?


@IBAction func cancel() {
    delegate?.itemDetailViewControllerDidCancel(self)
}

@IBAction func done() {
    if let item = itemToEdit {
        item.text = textField.text!
        delegate?.itemDetailViewController(self, didFinishEditingItem: item)
    }
    else {
        let item = ChecklistItem()
        item.text = textField.text!
        delegate?.itemDetailViewController(self, didFinishAddingItem: item)
    }
}

override func tableView(tableView: UITableView, willSelectRowAtIndexPath indexPath: NSIndexPath) -> NSIndexPath? {
    return nil
}

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

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    let oldText: NSString = textField.text!
    let newText: NSString = oldText.stringByReplacingCharactersInRange(range, withString: string)
    doneBarButton.enabled = (newText.length > 0)
    return true
}

override func viewDidLoad() {
    super.viewDidLoad()
    textField.delegate = self
    if let item = itemToEdit {
        title = "Edit Item"
        textField.text = item.text
        doneBarButton.enabled = true
    }
}
}

ChecklistViewController

import UIKit

class ChecklistViewController: UITableViewController, ItemDetailViewControllerDelegate {

var checklist: Checklist!

override func viewDidLoad() {
    super.viewDidLoad()
    title = checklist.name
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return checklist.items.count
}

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        let item = checklist.items[indexPath.row]
        performSegueWithIdentifier("ShowMap", sender: item)
        tableView.deselectRowAtIndexPath(indexPath, animated: true)

}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("ChecklistItem", forIndexPath: indexPath)
        let item = checklist.items[indexPath.row]
        configureTextForCell(cell, withChecklistItem: item)
        return cell
}

override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
        // 1
        checklist.items.removeAtIndex(indexPath.row)
        // 2
        let indexPaths = [indexPath]
        tableView.deleteRowsAtIndexPaths(indexPaths, withRowAnimation: .Automatic)
}

func configureTextForCell(cell: UITableViewCell,withChecklistItem item: ChecklistItem) {
        let label = cell.viewWithTag(1000) as! UILabel
        label.text = item.text
}

func itemDetailViewControllerDidCancel(controller: ItemDetailViewController) {
    dismissViewControllerAnimated(true, completion: nil)
}

func itemDetailViewController(controller: ItemDetailViewController,didFinishEditingItem item: ChecklistItem) {
        if let index = checklist.items.indexOf(item) {  // indexOf needs to compare (test for equality) item to the items in the array
            let indexPath = NSIndexPath(forRow: index, inSection: 0)
            if let cell = tableView.cellForRowAtIndexPath(indexPath) {
                configureTextForCell(cell, withChecklistItem: item)
            }
        }
        dismissViewControllerAnimated(true, completion: nil)

}

func itemDetailViewController(controller: ItemDetailViewController, didFinishAddingItem item: ChecklistItem) {
        let newRowIndex = checklist.items.count
        checklist.items.append(item)
        let indexPath = NSIndexPath(forRow: newRowIndex, inSection: 0)
        let indexPaths = [indexPath]
        tableView.insertRowsAtIndexPaths(indexPaths, withRowAnimation: .Automatic)
        dismissViewControllerAnimated(true, completion: nil)
}

override func prepareForSegue(segue: UIStoryboardSegue,sender: AnyObject?) {
    if segue.identifier == "AddItem" {
        let navigationController = segue.destinationViewController
                as! UINavigationController
        let controller = navigationController.topViewController
                as! ItemDetailViewController
        controller.delegate = self
    }
    else if segue.identifier == "EditItem" {
        let navigationController = segue.destinationViewController
                as! UINavigationController
        let controller = navigationController.topViewController
                as! ItemDetailViewController
        controller.delegate = self

        if let indexPath = tableView.indexPathForCell(
            sender as! UITableViewCell) {
                controller.itemToEdit = checklist.items[indexPath.row]
        }
    }
}
}

1 个答案:

答案 0 :(得分:0)

ChecklistViewController:prepareForSegue中的segue标识符可能是不正确的,还是在故事板中设置不正确?如果是这样,目标控制器委托将不会被设置。