协议和代表不起作用..我做错了啥?
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 应用程序中发布 geosever 层,使用 arcgis SDK,我已经完成了代码但它不起作用,请告诉我我做错了啥?