协议和委派不起作用.我做错了什么



我正试图通过委派和协议将我的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
        }
    }
}

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

    @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

当您调用时

delegate?.trainersViewController(self, didFinishSendingImage: trainer)

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

print(delegate)

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

您只需在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,设置delegate,segue。(但这是我的尝试,可以忽略它)

最新更新