iOS - Как установить изображение родительского контроллера представления через дочерний контейнер?

В настоящее время я использую представление контейнера и хочу изменить значение родительского контроллера представления imageView через дочерний контроллер представления с помощью делегатов, но он всегда возвращает nil.

import UIKit

protocol updateImage {
    func userIsDone(image:UIImage)
}

class ViewController: UIViewController, updateImage{

    @IBOutlet weak var imageView:UIImageView!
    var image = UIImage(named: "hello.png")

    override func viewDidLoad() {
        super.viewDidLoad()
        self.imageView.image=self.image
    }

    func userIsDone(image: UIImage) {
        self.image=image
    }

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

        if segue.identifier == "containerChild"{

            let nextView = segue.destinationViewController as! ControllerChild
            nextView.image=self.image
            nextView.delegate=self
        }
    }
}

class ControllerChild:UIViewController{

    var image=UIImage(named: "newhello.png")
    var delegate: updateImage? = nil

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func changeImage(sender:UIButton){

        if(delegate != nil){
            self.delegate!.userIsDone(self.image!)
            print("I am Called!")
        }
    }
}

person Zuhaib Rasheed    schedule 25.03.2017    source источник
comment
Вместо того, чтобы публиковать изображение кода, опубликуйте фактический код в своем вопросе.   -  person Fahim    schedule 25.03.2017
comment
выложил код. @Фахим   -  person Zuhaib Rasheed    schedule 25.03.2017
comment
Спасибо :) Сейчас посмотрю. Опубликую, если у меня будет ответ.   -  person Fahim    schedule 25.03.2017
comment
Я не понимаю, почему у вас есть prepareForSegue, если у VC есть контейнер, который содержит другой VC как дочерний. Хотите опубликовать поток раскадровки?   -  person OhadM    schedule 25.03.2017
comment
Потому что мне нужно добавить несколько контейнеров, и они будут вызываться при сегментированном действии. можете ли вы помочь в этом. @ОхадМ   -  person Zuhaib Rasheed    schedule 25.03.2017


Ответы (1)


Удалите эту строку:

nextView.image = image

И измените функцию userIsDone на:

func userIsDone(image: UIImage) {
    imageView.image = image
}

привет

В качестве примечаний:

  • В Swift вам не нужно использовать self вне блоков/закрытий. Например, вам не нужно self.imageView.image = self.image — достаточно imageView.image = image.
  • Протоколы должны быть в верхнем регистре, например UpdateImage (вместо updateImage).
  • Вам не нужны эти дополнительные .png для ссылок на изображения, только заголовок, например: "hello".

Apple описывает соглашения по коду Swift в своем отличная книга по Swift.

Вот код, рефакторинг (Swift 3):

import UIKit

protocol UpdateImageProtocol {
    func userIsDone(image: UIImage)
}

class ViewController: UIViewController, UpdateImageProtocol {

    @IBOutlet weak var imageView: UIImageView!
    var image = UIImage(named: "hello")

    override func viewDidLoad() {
        super.viewDidLoad()
        userIsDone(image: image!)
    }

    func userIsDone(image: UIImage) {
        imageView.image = image
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "containerChild" {
            let nextView = segue.destination as! ChildViewController
            nextView.delegate = self
        }
    }
}

class ChildViewController: UIViewController {

    var image = UIImage(named: "newHello")
    var delegate: UpdateImageProtocol?

    @IBAction func changeImage(sender: UIButton) {
        delegate?.userIsDone(image: image!)
    }
}
person backslash-f    schedule 25.03.2017
comment
спасибо, с этим проблема решена. не могли бы вы рассказать, как изменить контроллер представления контейнера при сегментированном действии. @обратная косая черта-f - person Zuhaib Rasheed; 25.03.2017
comment
Без проблем. Я не уверен, что понял ваш вопрос... Чего именно вы хотели бы добиться? (Я предлагаю создать еще один отдельный вопрос с более подробной информацией, в этих полях комментариев может возникнуть путаница). - person backslash-f; 25.03.2017