2015-10-12 183 views
1

我的代碼如下。當我按下「完成」或「取消」按鈕時,它不起作用。我做了一些調試,並且delegatenil即使我設置它。請幫忙 - 謝謝。視圖控制器委託返回無

class ViewController: UIViewController,EditViewControllerDelegate { 

    @IBOutlet weak var label: UILabel! 

    //頁面跳轉時 
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     if segue.identifier == "EditView" { 
      //通過seque的標識獲得跳轉目標 
      let controller = segue.destinationViewController as! EditViewController 
      //設置代理 
      controller.delegate = self 
      //將值傳遞給新頁面 
      controller.oldInfo = label.text 
     } 
    } 

    func editInfo(controller:EditViewController, newInfo:String){ 

     label.text = newInfo 
     //關閉編輯頁面 
     controller.presentingViewController!.dismissViewControllerAnimated(true, completion: nil) 
    } 

    func editInfoDidCancer(controller:EditViewController){ 

     //關閉編輯頁面 
     controller.presentingViewController!.dismissViewControllerAnimated(true, completion: nil) 
    } 
} 

import UIKit 

protocol EditViewControllerDelegate { 
    func editInfo(controller:EditViewController, newInfo:String) 
    func editInfoDidCancer(controller:EditViewController) 
} 

class EditViewController: UIViewController { 

    @IBOutlet weak var textField: UITextField! 

    var delegate:EditViewControllerDelegate? 

    var oldInfo:String? 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // Do any additional setup after loading the view. 
     if oldInfo != nil{ 
      textField.text = oldInfo 
     } 
    } 

    @IBAction func done(sender: AnyObject) { 
     delegate?.editInfo(self, newInfo: textField.text!) 
    } 

    @IBAction func cancel(sender: AnyObject) { 
     delegate?.editInfoDidCancer(self) 
    } 
} 
+3

你設置的'prepareForSegue'方法中設置斷點?你確定'代表'是否曾經設置?也許你的segue不叫'EditView',但稍有不同? –

+0

只要注意到你有一個'editInfoDidCancer'方法,大概這應該是'editInfoDidCancel'? – mttrb

+0

謝謝,我試過了,代表沒有設置。我怎麼解決這個問題? –

回答

1

我無法從你的代碼告訴你如何從你的ViewController處理的EditViewController開幕。

我猜你的prepareForSegue:sender:沒有被調用導致代理沒有被設置。爲了解決這個問題,你需要在點添加performSegueWithIdentifier:sender:調用其中SEGUE需要發生在

self.performSegueWithIdentifier("EditView", sender: self) 

,就應該替換任何代碼正在執行的EditViewController與呼叫開幕。

我有一個應用程序的使用showViewController:sender:從第一個開放第二個視圖控制器,即使在我的故事板中定義了一個Show segue。我的故事板中的segue在這種情況下不會被使用,並且prepareForSegue:sender:從不會被調用。

如果我代替我

showViewController(myVC, sender: self) 

performSegueWithIdentifier("mySegue", sender: self) 

然後prepareForSegue:sender:將被調用。如果我像prepareForSegue:sender:那樣設置委託人,代表將在代理髮生前設置。

1

試試這個,

class ViewController: UIViewController,EditViewControllerDelegate { 
var controller: EditViewController? 
    @IBOutlet weak var label: UILabel! 

    //頁面跳轉時 
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     if segue.identifier == "EditView" { 
      //通過seque的標識獲得跳轉目標 
      controller = segue.destinationViewController as! EditViewController 
      //設置代理 
      controller.delegate = self 
      //將值傳遞給新頁面 
      controller.oldInfo = label.text 
     } 
    } 

    func editInfo(controller:EditViewController, newInfo:String){ 

     label.text = newInfo 
     //關閉編輯頁面 
     controller.presentingViewController!.dismissViewControllerAnimated(true, completion: nil) 
    } 

    func editInfoDidCancer(controller:EditViewController){ 

     //關閉編輯頁面 
     controller.presentingViewController!.dismissViewControllerAnimated(true, completion: nil) 
    } 
} 

import UIKit 

protocol EditViewControllerDelegate { 
    func editInfo(controller:EditViewController, newInfo:String) 
    func editInfoDidCancer(controller:EditViewController) 
} 

class EditViewController: UIViewController { 

    @IBOutlet weak var textField: UITextField! 

    var delegate:EditViewControllerDelegate? 

    var oldInfo:String? 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // Do any additional setup after loading the view. 
     if oldInfo != nil{ 
      textField.text = oldInfo 
     } 
    } 

    @IBAction func done(sender: AnyObject) { 
     delegate?.editInfo(self, newInfo: textField.text!) 
    } 

    @IBAction func cancel(sender: AnyObject) { 
     delegate?.editInfoDidCancer(self) 
    } 
} 
相關問題