iOS开发:嵌套数组问卷遍历完成后跳转至下一个顶层元素的实现
解决Swift嵌套问卷遍历后跳转至下一个顶层元素的问题
核心思路
将解析后的顶层TreeItem数组作为类级数据源,维护一个当前顶层元素的索引变量。每当完成一个分支的遍历后,自动递增索引并加载下一个顶层元素,实现连续遍历。
具体实现步骤
1. 定义数据源与索引变量
在你的问卷处理类(如ViewController或自定义管理类)中,添加两个关键变量:
// 已解析完成的顶层TreeItem数组 var topLevelTreeItems: [TreeItem] = [] // 当前正在处理的顶层元素索引 var currentTopIndex: Int = 0
2. 实现分支遍历完成后的跳转逻辑
假设你已有traverseTreeItem(_:)方法负责递归遍历单个TreeItem的嵌套分支,在该方法的遍历完成回调中添加跳转逻辑:
// 递归遍历单个TreeItem的嵌套分支,完成后触发回调 func traverseTreeItem(_ item: TreeItem, completion: @escaping () -> Void) { // 你的现有遍历逻辑:处理当前item的选项,递归遍历子ChoiceItem // ... // 当当前分支所有嵌套元素都处理完毕时,调用completion completion() } // 启动下一个顶层元素的遍历入口 func startNextTopLevelItem() { guard currentTopIndex < topLevelTreeItems.count else { // 所有顶层元素遍历完成,执行结束逻辑 print("所有问卷内容已处理完毕") return } let currentItem = topLevelTreeItems[currentTopIndex] traverseTreeItem(currentItem) { [weak self] in // 分支遍历完成,索引自增 self?.currentTopIndex += 1 // 自动启动下一个顶层元素的遍历 self?.startNextTopLevelItem() } }
3. 同步更新UI展示
如果UI是基于当前TreeItem渲染的,在启动新元素遍历前更新UI:
func startNextTopLevelItem() { guard currentTopIndex < topLevelTreeItems.count else { return } let currentItem = topLevelTreeItems[currentTopIndex] // 根据当前TreeItem更新问卷UI(标题、选项等) updateQuestionnaireUI(with: currentItem) traverseTreeItem(currentItem) { [weak self] in self?.currentTopIndex += 1 self?.startNextTopLevelItem() } } // 示例UI更新方法 func updateQuestionnaireUI(with item: TreeItem) { questionTitleLabel.text = item.title // 刷新选项列表、绑定交互事件等 // ... }
4. 支持手动跳转场景
如果需要允许用户手动跳过当前分支,添加手动跳转方法:
func skipToNextTopLevelItem() { guard currentTopIndex + 1 < topLevelTreeItems.count else { print("已无后续问卷元素") return } currentTopIndex += 1 startNextTopLevelItem() }
注意事项
- 闭包中使用
[weak self]避免循环引用,防止内存泄漏。 - 确保
traverseTreeItem的completion回调仅在所有嵌套分支处理完成时触发(比如用户完成最底层选项选择后)。 - 若涉及异步操作(如加载子选项数据),需保证
completion在异步任务结束后执行。
内容的提问来源于stack exchange,提问作者Kshitij876
相关产品推荐
相关产品推荐

