Чтобы перемещаться между контроллерами представления, передающими данные в обоих направлениях, вам нужно несколько вещей.
последовательный метод навигации: переходы или нажатие/выталкивание с помощью навигационного контроллера или модальное представление/закрытие, но не их сочетание для одного А-Б-А переход
протоколы/делегаты, позволяющие передавать данные обратно от дочернего к родительскому.
В приведенном ниже примере навигация осуществляется через контроллер навигации, а изображение используется в качестве примера того, как передать данные обратно родительскому элементу. Это должно быть тривиально, чтобы адаптировать это для других обстоятельств.
Дочернему классу нужен согласованный интерфейс с его родителем, чтобы он мог взаимодействовать. Делается это протоколом. В этом примере мы предоставляем дочернему элементу возможность передать свое обновленное изображение обратно родителю:
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)
}
}
person
flanker
schedule
08.11.2019