Swift - сохранить настройки ViewController после перехода - PullRequest
1 голос
/ 08 ноября 2019

В данный момент мне нужно ViewControllers. Вы можете переключаться между ViewControllerA и ViewControllerB с помощью show-segues. Проблема в том, что каждый раз, когда я переключаюсь обратно, состояние ViewControllers сбрасывается. Как я могу сохранить настройки ViewController?

От A до B

    @IBAction func editButtonTapped(_ sender: Any) {
    let imageCollectionView = self.storyboard?.instantiateViewController(withIdentifier: "ImageCollectionVC") as! ImageCollectionViewController

    self.navigationController?.pushViewController(imageCollectionView, animated: true)
}

От B до A

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    tappedImage = images[indexPath.row]
    performSegue(withIdentifier: "backToPopUpView", sender: self)

}

Ответы [ 2 ]

1 голос
/ 08 ноября 2019

Для перемещения между контроллерами представления, передающими данные в обе стороны, вам нужно несколько вещей

  • последовательный метод навигации: переходы или нажатие / выталкивание через контроллер навигации или модально представление / отклонение , но не их сочетание для одного перехода A - B - A

  • протоколов / удалений для разрешения данныхдля передачи от потомка к родителю.

В приведенном ниже примере навигация осуществляется с помощью контроллера навигации, а изображение используется в качестве примера того, как передавать данные обратно вродитель. Это должно быть тривиально адаптировать это для других обстоятельств.

Дочернему классу необходим согласованный интерфейс с его родителем, чтобы позволить ему общаться. Это делается с помощью протокола. В этом примере мы предоставляем дочернему средству возможность передать его обновленное изображение обратно родителю:

protocol ClassBDelegate {
    func childVCDidComplete(with image: UIImage?)
}

Затем создайте переменную-делегат в дочернем классе, которая может указывать на любой класс, который принимает протокол (которыйв этом случае будет его родитель), а затем использовать этот делегат и функцию протокола для передачи данных изображения обратно. Как только данные были переданы обратно через делегата, контроллер представления B вызывает метод контроллера навигации popViewCntroller, чтобы закрыть себя и вернуть фокус для просмотра контроллера A

class B: UIViewController {
    var delegate: ClassBDelegate?

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        tappedImage = images[indexPath.row]
        delegate?.childVCDidComplete(with: tappedImage)
        navigationController?.popViewController(animated: true)
    }
}

Чтобы все это работало, дочернее представлениеделегат контроллера должен быть установлен так, чтобы указывать его родительский контроллер представления (A), но прежде чем это может произойти, этот класс должен соответствовать протоколу:

extension A: ClassBDelegate {}
    func childVCDidComplete( with image: UIImage?) {
        self.image = image
    }
}

Теперь, когда создается экземпляр дочернего контроллера представления, устанавливаются родителисам как делегат, таким образом завершая цикл связи.

Class A: UIViewController {
    var image: UIImage?

    @IBAction func editButtonTapped(_ sender: Any) {
        let imageCollectionView = self.storyboard?.instantiateViewController(withIdentifier: "ImageCollectionVC") as! ImageCollectionViewController
        imageCollectionView.delegate = self
        self.navigationController?.pushViewController(imageCollectionView, animated: true)
    }
}
0 голосов
/ 08 ноября 2019

Вы создали новый ViewControllerA, и у вас есть следующий результат A -> B -> A. Но это не так, вы должны отклонить ViewControllerB ...

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    tappedImage = images[indexPath.row]
    self.dismiss(animated: true, completion: nil)
    //performSegue(withIdentifier: "backToPopUpView", sender: self)

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...