Для перемещения между контроллерами представления, передающими данные в обе стороны, вам нужно несколько вещей
последовательный метод навигации: переходы или нажатие / выталкивание через контроллер навигации или модально представление / отклонение , но не их сочетание для одного перехода 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)
}
}