ios - 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...
}
推荐阅读
- f# - 如何实现策略模式以返回声明为私有的结构?
- c++ - Qt 应用程序部署不起作用。缺少入口点和 dll
- javascript - JavaScript:意外的结果得到该月剩余的天数
- java - 对android项目的结构和MVC模式感到困惑
- u-sql - 在 USQL 中解析多个日期时间
- angularjs - AngularJS 表单验证在表单外的 href 链接上触发
- java - Eclipselink jpa - sql查询结果映射到java对象
- python - Python difflib:difflib 的 htmldiff 将多行合二为一
- cassandra - 为什么在截断表之前将一致性设置为 ALL
- c++ - 使用 random_shuffle 的多个类的向量不会按预期进行混洗