Как перезагрузить представление коллекции после закрытия модального представления настоящего? - PullRequest
0 голосов
/ 11 июля 2020

У меня есть панель вкладок с двумя элементами панели вкладок, и я добавляю на нее центральную кнопку addButton, которая может привести меня к контроллеру просмотра элементов. Вот настройка средней кнопки.

 func setupMiddleButton() {
    
    let tabBarHeight = tabBar.frame.size.height
    
   
    let menuButton = UIButton(frame: CGRect(x: 0, y: 0, width: tabBarHeight*1.5, height: tabBarHeight*1.5))
    var menuButtonFrame = menuButton.frame
    
    menuButtonFrame.origin.y = view.bounds.height - menuButtonFrame.height/2 - tabBarHeight - 8

    menuButtonFrame.origin.x = view.bounds.width/2 - menuButtonFrame.size.width/2
    menuButton.frame = menuButtonFrame
    
    menuButton.backgroundColor = UIColor.red
    menuButton.layer.cornerRadius = menuButtonFrame.height/2
    view.addSubview(menuButton)
    
    let largeConfiguration = UIImage.SymbolConfiguration(scale: .large)
    let addIcon = UIImage(systemName: "plus", withConfiguration: largeConfiguration)
    menuButton.setImage((addIcon), for: .normal)
    
    menuButton.addTarget(self, action: #selector(menuButtonAction(sender:)), for: .touchUpInside)
    
    view.layoutIfNeeded()
}

@objc private func menuButtonAction(sender: UIButton) {
      let addVC = AddViewController()
      let navigationController = UINavigationController(rootViewController: addVC)
      
      performSegue(withIdentifier: "addEventSegue", sender: sender)
    

    
}

, и я сделал это в одном из представлений панели вкладок для reloadData, но я обнаружил, что collectionView не может перезагрузиться после того, как я закончил редактирование и отклонил настоящее модально

override func viewWillAppear(_ animated: Bool) {
    lifeCollectionView.delegate = self
    lifeCollectionView.dataSource = self
    self.fetchData()
    DispatchQueue.main.async {
        self.lifeCollectionView.reloadData()
    }
    
}

Что мне делать, чтобы перезагрузить представление коллекции после того, как я отклонил его модально? Спасибо вам огромное!

Ответы [ 2 ]

0 голосов
/ 11 июля 2020

Установите источник данных представления коллекции, делегируйте и перезагрузите только в viewDidLoad.
Вам не нужно использовать viewWillAppear для перезагрузки вашего collectionView каждый раз!

Используйте делегаты для передачи сообщений.

protocol ContentChangedDelegate: class {
    func itemAdded()
}

В пределах AddViewController добавьте указанную ниже переменную

weak var delegate: ContentChangedDelegate? = nil

Установите экземпляр подкласса UIViewController, где lifeCollectionView существует как делегат для AddViewController.

let addVC = AddViewController()
addVC.delegate = self
//push or present addVC

Согласуйте свой контроллер представления с ContentChangedDelegate протокол и в рамках метода itemAdded вы можете перезагрузить представление вашей коллекции.

Вызовите delegate?.itemAdded() после добавления вашего элемента в AddViewController. Это вызовет метод в вашем списке V C, и он должен немедленно обновиться.

0 голосов
/ 11 июля 2020

Существует несколько способов достижения этого делегата, закрытия и стиля модального представления

Способ 1: если вы добавите navigationController.modalPresentationStyle = .fullScreen, это вызовет viewWillAppear контроллера, который представляет контроллер и ваш метод перезагрузки будет называться

Способ 2: Делегирование и протокол

Объявите протокол, подобный приведенному ниже, во втором контроллере

protocol CallParent{
    func reloadCollection()
}

Объявить свойство для хранения ссылки контроллера представления, подтверждающего этот протокол, во втором контроллере

weak var myParent : CallParent?

Теперь вызовите reloadCollection перед отклонением

 if let parent = myParent {
    parent.reloadCollection()
}

Подтвердите первый контроллер с протоколом CallParent

class FirstVC: UIViewController,CallParent{

Затем при вызове segue

@objc private func menuButtonAction(sender: UIButton) {
      let addVC = AddViewController()
       addVC.myParent = self 
      let navigationController = UINavigationController(rootViewController: addVC)
      
      performSegue(withIdentifier: "addEventSegue", sender: sender)
    

    
}

Способ 3: В представленном вами контроллере вызовите функцию отклонения, подобную этой

 if let fvc = self.presentingViewController as? FirstController {

        self.dismiss(animated: true) {
             fvc.callReloadFunctionHere()
        }
    }

Способ 4: Закрытие

class SecondViewController: UIViewController {
    var onViewWillDisappear: (()->())?

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        onViewWillDisappear?()
    }
    ...
}

В FirstController

 @objc private func menuButtonAction(sender: UIButton) {
          let addVC = AddViewController()
              addVC.onViewWillDisappear = {
                // reload collection view here 
            }
          let navigationController = UINavigationController(rootViewController: addVC)
          
          performSegue(withIdentifier: "addEventSegue", sender: sender)
        
    
        
    }
...