微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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")
        

        }
}

设置中我缺少什么?

解决方法

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。