协议和代表不起作用..我做错了啥?

Posted

技术标签:

【中文标题】协议和代表不起作用..我做错了啥?【英文标题】:Protocol and Delegate not working.. what did i do wrong?协议和代表不起作用..我做错了什么? 【发布时间】:2015-12-04 20:51:12 【问题描述】:

我正在尝试通过委托和协议将图像从我的 collectionViewCell imageView 发送到另一个 VC 中的 imageView。我不知道为什么这不能正常工作?

发送VC是:TrainersViewController 接收VC是:BioViewController

这是我的协议:

protocol TrainersViewControllerDelegate: class 

    func trainersViewController(controller: TrainersViewController, didFinishSendingImage trainer:TrainerArray)



class TrainersViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate, AddNewTrainerViewControllerDelegate 

    weak var delegate: TrainersViewControllerDelegate? 

这是我的接收类:

class BioViewController: UIViewController, TrainersViewControllerDelegate 


    @IBAction func backToTrainersButton(sender: AnyObject) 

        dismissViewControllerAnimated(true, completion: nil)
    

    override func viewDidLoad() 
        super.viewDidLoad()
    

    @IBOutlet weak var bioImage: UIImageView!


    func trainersViewController(controller: TrainersViewController, didFinishSendingImage trainer: TrainerArray) 

        trainer.trainerImage! = bioImage as! UIImage
    

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 

        if segue.identifier == "biosegue" 
            let navigationController = segue.destinationViewController as! UINavigationController
            let controller = navigationController.topViewController as! TrainersViewController
            controller.delegate = self
        
    

最后这里是 collectionViewCell 中的按钮,我正在调用它来实现这一点:

    @IBAction func bioSegueButton(sender: AnyObject) 
    let index = sender.tag
    let trainer = trainers[index]
    print(trainer.name)
    delegate?.trainersViewController(self, didFinishSendingImage: trainer)
    performSegueWithIdentifier("bioSegue", sender: self)

为什么这没有将我的图片发送到其他 VC 的 imageView 中?

【问题讨论】:

你正在做trainer.trainerImage! = bioImage as! UIImage,它会崩溃,因为bioImage 不是UIImage 它是UIImageView。我很确定你希望那是bioImage.image = trainer.trainerImage! 太棒了!我切换了那个代码。它没有给我任何警告或错误,这意味着它可以工作..但是当我点击我的按钮,转到 Bio 屏幕时,它不显示任何图像。 也许它与我在哪里调用协议函数有关?我无法弄清楚那部分.. 【参考方案1】:

打电话的时候

delegate?.trainersViewController(self, didFinishSendingImage: trainer)

变量delegate 尚未设置。您可以使用以下行进行检查:

print(delegate)

如果未设置委托,则此行将打印nil

【讨论】:

那么我如何确保设置了委托并发送了图片> 你在哪个控制器中执行 bioSegueButton 动作? 在第一个控制器中,在我的 collectionViewCell 中【参考方案2】:

您可以在prepareForSegue 中传递图像,这是最简单的方法(但您必须在sending 类中实现它)。前面的答案是正确的。在设置委托之前使用它。如果你真的想使用它,我会先执行 segue,在准备它时设置委托,然后尝试使用委托方法。

@IBAction func bioSegueButton(sender: AnyObject) 
    let index = sender.tag
    let trainer = trainers[index]
    print(trainer.name)
    performSegueWithIdentifier("bioSegue", sender: self)
    delegate?.trainersViewController(self, didFinishSendingImage: trainer)

这可能会导致另一个问题,但这与委派无关:)

您可以尝试撤销您的授权。在BioViewController 中使用方法bioViewControllerSetUpImage(bioViewController: BioViewController) -> UIImage 使BioViewControllerDelegate 在发送类中实现它并在BioViewController 类中调用它,例如viewDidLoad 中的bioImage = delegate?.bioViewControllerSetUpImage(self)。然后你创建BioViewController,设置委托,segue。 (但这是我尝试解决的问题,请随意忽略它)

【讨论】:

以上是关于协议和代表不起作用..我做错了啥?的主要内容,如果未能解决你的问题,请参考以下文章

为啥通知组在android中不起作用?我做错了啥?

我想在 android 应用程序中发布 geosever 层,使用 arcgis SDK,我已经完成了代码但它不起作用,请告诉我我做错了啥?

使用 API 不起作用,我在这里做错了啥?

Jumbotron 背景图像不起作用。我究竟做错了啥?

在 PHP 中,使用 DomDocument getElementByID 不起作用?我究竟做错了啥?

jquery delete parent 在整条线上都不起作用!我究竟做错了啥? [关闭]