от
Я позволяю пользователю выбирать фоновое изображение при входе в систему. Исходя из выбора пользователем выбора изображения, я хочу показать другой контроллер представления с изображением, которое выбрал пользователь. Я следую некоторым примерам из 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  
    

        

Пожалуйста, войдите или зарегистрируйтесь для публикации ответа на этот вопрос.

2 Ответы

0 голосов
от
Пожалуйста, попробуйте установить optinal imageSelectionDelegate в SelectBackgroundViewController следующим образом;
var imageSelectionDelegate: SelectionImageDelegate?
    
0 голосов
от
«неявно распаковка» означает, что вы пытаетесь получить доступ к «неявно распакованному необязательному» значению, которое не содержит значения, но имеет значение
nil
. В вашем случае вы имеете дело с двумя опциями: Делегат
imageSelectionDelegate
не может быть установлен.
UIImage(named: "Snow_Background")
может вернуть
nil
Доступ к делегату - если
nil
приведет к ошибке
Unexpectedly found nil while implicitly unwrapping an Optional value
, а доступ к изображению - если
nil
- приведет к KaUaRdlhJJCJ Итак, поскольку вы наблюдаете первую ошибку, делегат равен nil, что кажется странным, потому что вы установили его в
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)
}
Затем проверьте вывод.     
Добро пожаловать на сайт ByNets, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...