2016-06-20 6 views
0

代理人のプロトコルを含む迅速なプロジェクトに取り組んでいます。私はこの中で円滑に動作している2つのファイルを持っていますが、別の2つのファイルにデリゲートが何も出てこないという問題があります。デリゲートが何らかの理由で設定/作成されていないようです。代理人がスウィフトで作成されない

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

"ShowMap"というセグを実行しますが、他の名前でセグを構成するだけです。あれは正しいですか?これらの他のセグは実行されていますか? – vikingosegundo

答えて

0

それはChecklistViewControllerであなたのセグエ識別子ことは可能です::prepareForSegueは正しくない、またはで正しく設定されない以下のコードを参照してください。ストーリーボード?そうであれば、宛先コントローラデリゲートは設定されません。

関連する問題