首页 > 解决方案 > UIPageViewController 直接跳转到页面会导致实例变量出现问题

问题描述

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

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

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")
        

        }
}

我在设置中缺少什么?

标签: iosswiftuipageviewcontrollerviewdidappear

解决方案


我解决了我的问题。由于我对 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...
}

推荐阅读