Вызывающая функция при возврате представления из подвида | Swift

#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. да, вам нужно назначить родительское представление в качестве делегата. рад, что сейчас это работает.