【问题标题】:Pass request data from UIPageViewController to child views将请求数据从 UIPageViewController 传递给子视图
【发布时间】:2017-09-02 17:35:06
【问题描述】:

我有MainViewController 那是我的UIPageViewController。我要显示 2 个视图 FirstDataViewControllerSecondDataViewController

我想执行更新MainViewControllre 中的items 的请求,然后将其传递给我的 2 个子视图。

getData 是我的函数,它包含来自 Request 的数据,然后更新 MainViewController's 项目

extension MainViewController {
    func getData() {
        getBasicData() { [weak self] (basicModel) in
            guard let strongSelf = self else { return }
            strongSelf.getExperienceData() { [weak self] (experienceModel) in
                guard let strongSelf = self else { return }

                let items = RequestItems(basicData: basicModel,
                                         experienceData: experienceModel)

                strongSelf.updateItems(items: items)
            }
        }
    }
}

主视图控制器:

class MainViewController: UIPageViewController {

    var items: RequestItems

    let firstDataViewController: FirstDataViewController
    let secondDataViewController: SecondDataViewController

    let basicDataManager: APIManagerProtocol
    let experienceDataManager: APIManagerProtocol

    private(set) lazy var orderedViewControllers: [UIViewController] = {
        return [self.firstDataViewController, self.secondDataViewController]
    }()

    convenience init() {
        self.init(with: RequestItems())
    }

    init(with items: RequestItems) {

        self.items = items

        let apiManager = APIManager()
        basicDataManager = apiManager.createBasicDataManager()
        experienceDataManager = apiManager.createExperienceDataManager()

        self.firstDataViewController = FirstDataViewController(with: items)
        self.secondDataViewController = SecondDataViewController(with: items)

        super.init(transitionStyle: .scroll, navigationOrientation: .horizontal, options: nil)

        self.edgesForExtendedLayout = []
    }

    func updateItems(items: RequestItems) {
        self.items = items
    }
}

如何使用getData()函数先更新MainViewController项,然后将数据传递给子视图?或者也许有更好的选择?

【问题讨论】:

    标签: ios swift request uipageviewcontroller pass-data


    【解决方案1】:

    这不是一个好的解决方案。 “GetData”方法需要一些时间才能完全执行,所以你应该:

    • 在加载 MainViewController 之前执行“getData”,然后将“请求项”传递给它并更新您的视图。

    但我假设您的 MainViewController 是您应用程序中的第一个控制器,因此您应该:

    1. 将完成块添加到您的“getData”方法中:

      func getData(_ completion: [RequestItems] -> ()) {
      
          getBasicData() { [weak self] (basicModel) in
      
              guard let strongSelf = self else { return }
      
              strongSelf.getExperienceData() { [weak self] (experienceModel) in
      
                  guard let strongSelf = self else { return }
      
                  let items = RequestItems(basicData: basicModel,
                                       experienceData: experienceModel)
      
                  completion(items)
              }
          }
      }
      
    2. 将“updateItems”方法添加到您的视图控制器(而不是在 init 方法中传递)

    3. 使用完成处理程序但在 MainViewController init 之外调用您的“getData”方法

      init(with items: RequestItems) {
          ...
          self.items = items
      
          self.firstDataViewController = FirstDataViewController()
          self.secondDataViewController = SecondDataViewController()
          ...
      }
      
      func viewDidLoad() {
          super.viewDidLoad()
      
          getBasicData { [weak self] (items) in 
              guard let strongSelf = self else { return }
      
      
              strongSelf.updateItems(items)
              strongSelf.firstDataViewController.updateItems(with: items)
              strongSelf.secondDataViewController.updateItems(with: items)
          }
      }
      
      func updateItems(items: RequestItems) {
          self.items = items
      }
      

    【讨论】:

    • 问题是updateItems是在child ViewControllers的init之后执行的。我无法传递数据,然后在viewDidLoad 中的child ViewController 之一中使用它。
    • 这些视图控制器的“init”背后的逻辑是什么?为什么你这么想把这个逻辑放到“init”中?
    • 我不想要它,但似乎 getData 更新 childViewController 太晚了,我不能在那里使用数据。我可能以错误的方式更新它。这是我的 MainViewController,它是我应用程序中的第一个视图控制器。 1.) pastebin.com/mvwmvQkT 2.) 扩展名:pastebin.com/chv4enQ8 这是子 ViewController 之一。 2.) pastebin.com/CEdyL7kL
    猜你喜欢
    • 2019-11-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-31
    • 2018-08-21
    • 1970-01-01
    • 2017-06-16
    • 1970-01-01
    相关资源
    最近更新 更多