Как исправить 'Swift Protocols / Delegates, устанавливающие UIImages - Неустранимая ошибка: неожиданно обнаружен ноль при неявном развертывании необязательного значения'? - PullRequest
0 голосов
/ 04 июля 2019

Я разрешаю пользователю выбирать фоновое изображение при входе в систему. Исходя из выбора пользователем выбора изображения, я хочу показать другой контроллер представления с изображением, которое выбрал пользователь. Я следую некоторым примерам из youtube, но получаю «Неустранимая ошибка: неожиданно обнаружен ноль при неявном развертывании необязательного значения», и изображение не задано.

protocol SelectionImageDelegate {

    func setBackgroundImage(selectedImage: UIImage)
}


class SelectBackgroundViewController: UIViewController {

    // MARK: IBOutlets
    @IBOutlet weak var snowBackgroundImage: UIImageView!
    @IBOutlet weak var desertBackgroundImage: UIImageView!
    @IBOutlet weak var pathwayBackgroundImage: UIImageView!
    @IBOutlet weak var beachBackgroundImage: UIImageView!

    // MARK: Properties
    var imageSelectionDelegate: SelectionImageDelegate!


    // MARK: Life Cycle
    override func viewDidLoad() {
        super.viewDidLoad()
        self.imageSelectionDelegate = FootprintViewController()
        setButtonCorners()
    }

    override func viewWillAppear(_ animated: Bool) {

        snowBackgroundImage.center.x  -= view.bounds.width
        desertBackgroundImage.center.x -= view.bounds.width
        pathwayBackgroundImage.center.x -= view.bounds.width
        beachBackgroundImage.center.x -= view.bounds.width
    }


    @IBAction func didTappedSnowBackground(_ sender: Any) {
        print("tapped snow")
        imageSelectionDelegate.setBackgroundImage(selectedImage: UIImage(named: "Snow_Background")!)
        print("set image")
        let vc = (self.storyboard?.instantiateViewController(withIdentifier: "FootprintVC"))!
        self.presentViewController(vc)
    }


    @IBAction func didTappedDesertBackground(_ sender: Any) {
        imageSelectionDelegate.setBackgroundImage(selectedImage: UIImage(named: "Desert_Background")!)
        let vc = (self.storyboard?.instantiateViewController(withIdentifier: "FootprintVC"))!
        self.presentViewController(vc)
    }


    @IBAction func didTappedPathwayBackground(_ sender: Any) {
        imageSelectionDelegate.setBackgroundImage(selectedImage: UIImage(named: "Pathway_Background")!)
        let vc = (self.storyboard?.instantiateViewController(withIdentifier: "FootprintVC"))!
        self.presentViewController(vc)
    }


    @IBAction func didTappedBeachBackground(_ sender: Any) {
        imageSelectionDelegate.setBackgroundImage(selectedImage: UIImage(named: "Beach_Background")!)
        let vc = (self.storyboard?.instantiateViewController(withIdentifier: "FootprintVC"))!
        self.presentViewController(vc)
    }

}


class FootprintViewController: UIViewController {


    // MARK: IBOutlets
    @IBOutlet weak var backgroundImageView: UIImageView!
    @IBOutlet weak var emptyFootprintImageView: UIImageView!

    // MARK: Life Cycles
    override func viewDidLoad() {
        super.viewDidLoad()
    }

}

extension FootprintViewController: SelectionImageDelegate {

    func setBackgroundImage(selectedImage: UIImage) {
        backgroundImageView.image = selectedImage
    }
}

class FootprintViewController: UIViewController {


    // MARK: IBOutlets
    @IBOutlet weak var backgroundImageView: UIImageView!
    @IBOutlet weak var emptyFootprintImageView: UIImageView!

    // MARK: Life Cycles
    override func viewDidLoad() {
        super.viewDidLoad()
    }

}

extension FootprintViewController: SelectionImageDelegate {

    func setBackgroundImage(selectedImage: UIImage) {
        backgroundImageView.image = selectedImage
    }
}

Ответы [ 2 ]

0 голосов
/ 07 июля 2019

«неявное развертывание» означает, что вы пытаетесь получить доступ к «неявно развернутому необязательному» значению, которое не содержит значения, но имеет значение nil.

В вашем случае вы имеете дело с двумя дополнительными:

  • Возможно, не установлен делегат imageSelectionDelegate.
  • UIImage(named: "Snow_Background") может вернуть nil

Доступ к делегату - если nil приведет к ошибке Unexpectedly found nil while implicitly unwrapping an Optional value, а доступ к изображению - если nil - приведет к Unexpectedly found nil while unwrapping an Optional value

Итак, поскольку вы наблюдаете первую ошибку, делегат равен нулю, что кажется странным, потому чтоВы устанавливаете его в viewDidLoad.

Чтобы исследовать немного больше, вы можете добавить еще немного информации трассировки в ваш обработчик действий, чтобы проверить, что происходит:

@IBAction func didTappedSnowBackground(_ sender: Any) {
    print("tapped snow")

    guard imageSelectionDelegate != nil else {
        print ("delegate is not set")
        return
    }

    guard let bgImage = UIImage(named: "Snow_Background") else {
        print ("Snow_Background image does not exist")
        return
    }

    imageSelectionDelegate.setBackgroundImage(selectedImage: bgImage)
    print("set image")
    let vc = (self.storyboard?.instantiateViewController(withIdentifier: "FootprintVC"))!
    self.presentViewController(vc)
}

Затем проверьте вывод.

0 голосов
/ 04 июля 2019

Пожалуйста, попробуйте установить optinal imageSelectionDelegate в SelectBackgroundViewController следующим образом:

var imageSelectionDelegate: SelectionImageDelegate?

...