2015-12-04 2 views
0

Я пытаюсь отправить изображение из моей коллекцииViewCell imageView в изображениеView в другом VC через делегирование и протокол. Я не могу понять, почему это работает неправильно?Протокол и делегат не работают .. что я сделал не так?

Передающий ВК: TrainersViewController ПОЛУЧАТЬ ВК: 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?

+0

Вы делаете 'trainer.trainerImage! = bioImage как! UIImage', который будет разбиваться, потому что 'bioImage' не является' UIImage' его 'UIImageView'. Я уверен, что вы хотите, чтобы это было 'bioImage.image = trainer.trainerImage!' – dan

+0

Отлично! Я включил этот код. Он не выдавал мне никаких предупреждений или ошибок, а это значит, что это работает. Но когда я нажимаю кнопку, чтобы перейти к экрану Bio, он не отображает изображения. –

+0

Может быть, это как-то связано с тем, где я вызываю функцию протокола? я не могу понять эту часть. –

ответ

0

В то время, когда вы звоните

delegate?.trainersViewController(self, didFinishSendingImage: trainer) 

delegate переменной еще не установлено. Вы можете проверить это с помощью следующей строки:

print(delegate) 

Если делегат не установлен, то эта строка будет печатать nil

+0

Итак, как я могу гарантировать, что делегат установлен, и изображение отправлено> –

+0

В каком контроллере вы выполняете действие bioSegueButton? –

+0

в первом контроллере, в моей коллекцииViewCell –

0

Вы можете просто передать изображение в 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 введите BioViewControllerDelegate с помощью метода bioViewControllerSetUpImage(bioViewController: BioViewController) -> UIImage реализовать его в классе отправки и вызвать его в классе BioViewController, например, в viewDidLoad, например bioImage = delegate?.bioViewControllerSetUpImage(self). Затем вы создаете BioViewController, установите делегат, segue. (Но это моя попытка поработать над этим, не стесняйтесь его игнорировать)

Смежные вопросы