2016-06-20 25 views
0

我正在致力於涉及代表協議的快速項目。我有兩個文件在這裏工作順利,但是我遇到了一個問題,即代理在不同的兩個文件中保持不變,在這裏我使用不同的名稱執行與之前相同的操作。看起來代表並沒有因爲某種原因而被設置/創建。請參見下面的代碼:代表未在Swift中創建

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

指出代碼/使用場景的特定位 – Wain

+0

您執行segue「ShowMap」,但您只配置其他名稱的segues。那是對的嗎?這些其他賽段執行了嗎? – vikingosegundo

回答

0

是否有可能在ChecklistViewController您賽格瑞標識符:prepareForSegue不正確,或正確設置不中故事情節?如果是這樣,目標控制器委託不會被設置。