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...
}
我是 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...
}