UIPageViewController直接跳转到页面导致实例变量出现问题

UIPageViewController jump directly to page causes issues with instance variables

我是 Swift 的新手,在 JavaScript 中编写了很多代码,所以我一定在这里遗漏了一些微妙的东西。我有一个控制 3 个页面的 UIPageViewController,每个页面都有一个由父 UIPageViewController 设置的特定实例变量。我们称该实例变量为 currentState。我还有一个功能,允许用户直接跳转到任何页面。但是,由于某种原因,当用户直接跳转到该页面时,调用viewDidAppear时似乎没有设置实例变量currentState,即使在页面代码的其他部分检测到它。

这是跳转页面的代码,传入状态:

func goToPage(index: Int)
    {
        if index < viewControllers!.count
        {
            let destViewController = viewControllers![index]
            (destViewController as! WorkflowController).currentState = DataStore.sharedStore.state
            setViewControllers([destViewController], direction: .forward, animated: true, completion: nil)
        }
    }

在目标页面的 viewDidAppear 中,测试代码表明状态未设置,即使在用户滚动到页面而不跳转时已正确设置:

override func viewDidAppear(_ animated: Bool)
{
        if let state = currentState
        {
            // Happens when user scrolls page by page until this one
            print("State variable loaded")
        }
        else
        {
            // Happens when user jumps to page
            print("State variable did NOT load")
        

        }
}

我在设置中缺少什么?

我解决了我的问题。由于我是 Swift 的新手(没关系 UIPageViewController),实际的“跳转到页面”是在其他地方完成的,而不是在上面发布的 goToPage 代码中。它实际上在 UIPageViewController's viewDidLoad 部分,如下所示。解决方案是确保在调用 setViewControllers 函数执行“跳转”之前设置目标控制器的所有实例变量:

 override func viewDidLoad() {
    super.viewDidLoad()
    
    
    dataSource = self
    
    // This is where we do a jump, if current page isn't the first page
    if currentPage != 0
    {
        
        let firstViewController = orderedViewControllers[currentPage]
        (firstViewController as! WorkflowController).currentState = DataStore.sharedStore.state
        (firstViewController as! WorkflowController).delegate = self
        
        setViewControllers([firstViewController],
                           direction: .forward,
                           animated: true,
                           completion: nil)
        
        
     
        
        return
    }

   // more code is omitted...
}