Установить UIImageView из модального окна в другой контроллер - PullRequest
0 голосов
/ 18 июня 2020

У меня есть форма, которую заполняет пользователь, и я представляю модальное окно с изображениями, из которых они могут выбирать. Я пытаюсь установить UIImage в исходном контроллере из модального окна, но проблема в том, что он равен нулю.

Как лучше всего его установить? ViewDidLoad, похоже, не срабатывает при закрытии модального окна, вот как я избавляюсь от него, и viewWillAppear тоже. Когда я могу установить изображение?

Мой код прямо сейчас:

    //Collection view choosing deal background
    @IBOutlet var collectionView: UICollectionView!
    var chosenNumber: Int?

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(true)

        if(self.restorationIdentifier == "NewDeal") {
            if(chosenNumber != nil) {
                newDealBackgroundImage.image = UIImage(named: "food_\(chosenNumber!)")
            }
        }
    }

extension BusinessOwnerVC: UICollectionViewDelegate {
    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        collectionView.deselectItem(at: indexPath, animated: true)

        //self.newDealBackgroundImage.image = UIImage(named: "food_\(indexPath.row + 1)")!
        chosenNumber = indexPath.row + 1

        self.dismiss(animated: true, completion: nil)
    }
}

Ответы [ 2 ]

0 голосов
/ 24 июня 2020

После долгих экспериментов я обнаружил, что мне подходит вот что. Все, что я хотел, - это получить доступ и обновить контроллер представления (того же типа) в модальном окне, которое я представляю. Оказалось, что мой предыдущий V C был все еще активен, поэтому все, что мне нужно было сделать, это передать ссылку на этот V C в модальное окно, а затем я мог изменить его свойства.

let modal = UIStoryboard.init(name: "BusinessOwner", bundle: nil).instantiateViewController(withIdentifier: "DealBackgroundSelection") as! BusinessOwnerVC

modal.newDealView = self // This is a weak var of BusinessOwnerVC? declared in the view controller itself

present(modal, animated: true, completion: nil)

И затем, когда я был готов отклонить это модальное окно:

self.newDealView!.updateDealImage(number: indexPath.row + 1)

updateDealImage был просто функцией, которую я создал для обработки всех обновлений. И это работает для меня.

0 голосов
/ 18 июня 2020

Если ваш стиль презентации fullScreen… тогда ваш willAppear будет называться

navigationController.modalPresentationStyle = .fullScreen

, но если вам не нужна полноэкранная презентация. Сделайте себя делегатом контроллера презентации и замените presentationControllerDidDismiss(_:).

class ViewController: UIViewController {

        override func viewWillAppear(_ animated: Bool) {
            super.viewWillAppear(animated)
            print("viewWillAppear")
        }

        @IBAction func show(_ sender: Any) {
            let newViewController = NewViewController()
            //set delegate of UIAdaptivePresentationControllerDelegate to self
            newViewController.presentationController?.delegate = self
            present(newViewController, animated: true, completion: nil)
        }
    }

    extension UIViewController: UIAdaptivePresentationControllerDelegate {
        public func presentationControllerDidDismiss( _ presentationController: UIPresentationController) {
            if #available(iOS 13, *) {
                //Call viewWillAppear only in iOS 13
                viewWillAppear(true)
            }
        }
    }
...