#ios #swift #viewdidappear
#iOS #swift #viewdidappear
Вопрос:
У меня есть представление в стиле «всплывающее окно», которое отображается как дочернее представление, чтобы оно отображалось перед контроллером родительского представления следующим образом:
let popOverView = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("newProjectPopup") as! AddProjectViewController
self.addChildViewController(popOverView)
popOverView.view.frame = self.view.frame
self.view.addSubview(popOverView.view)
popOverView.didMoveToParentViewController(self)
Чтобы закрыть всплывающее окно, я использую
self.view.removeFromSuperview()
Это отлично работает, помимо того факта, что он не вызывает методы viewWillAppear
or viewDidAppear
в родительском представлении. Мне нужно обновить информацию в контроллере родительского представления, когда всплывающее окно будет закрыто. Как я могу это сделать?
Комментарии:
1. К вашему сведению — вам нужно вызвать гораздо больше, чем просто
self.view.removeFromSuperview()
для правильного удаления содержащегося контроллера представления и его представления.
Ответ №1:
Вы можете использовать шаблон делегирования для обновления родительского представления.
Шаблон делегирования
protocol ParentViewControllerDelegate {
func didUpdate(data: NSData)
}
class parentViewController: UIViewController, ParentViewControllerDelegate {
func didUpdate(data: NSData) {
// Update logic here
}
}
Затем в вашем дочернем контроллере представления вы можете вызвать функцию делегирования didUpdate, прежде чем отклонять ее.
Комментарии:
1. Спасибо @koropok, я реализовал то, что вы предложили выше. Чтобы вызвать ее, я создал ссылку на делегат с помощью ‘var delegate: ParentViewControllerDelegate?’ в дочернем представлении, а затем запустил ‘делегировать? .didUpdate()’ прямо перед закрытием.
2. Исправлено, мне все еще нужно было назначить делегат popOverViews для self перед его отображением. ‘popOverView.delegate = self’
3. да, вам нужно назначить родительское представление в качестве делегата. рад, что сейчас это работает.