2015-10-12 142 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) 
    } 
} 
相关问题