Bro*_*ell 5 ios swift watchos swiftui
我有一个 SwiftUI watchOS 应用程序,它使用NavigationLinks 在几个视图之间进行路由。我正在使用NavigationLink'stag和selection参数来控制哪个视图可见。在我的真实应用程序中,当用户从复杂功能启动应用程序时,我希望能够导航回索引 0 处的视图。但是,每当$selection值不是 nil 或 0 并且$selection从我的视图模型设置为 0 时,索引 0 处的视图会短暂显示,然后由 SwiftUI$selection重置nil(两次),而不会导致任何用户交互。
我创建了一个示例应用程序来演示此行为,并带有一个近似于用户从复杂功能启动的计时器。我将选择值以外的所有内容都设为常量,以尝试消除差异作为可能的来源。
这是一个演示发生了什么的 gif:
import SwiftUI
struct Item: Identifiable {
let id: Int
let text: String
}
class ContentViewModel: ObservableObject {
@Published public var selectedIndex: Int? {
didSet {
print("ContentViewModel selectedIndex = \(String(describing: selectedIndex))")
}
}
public let items: [Item] = [
Item(id: 0, text: "Zero"),
Item(id: 1, text: "One"),
Item(id: 2, text: "Two"),
Item(id: 3, text: "Three"),
Item(id: 4, text: "Four")
]
private var timer: Timer?
init() {
self.timer = Timer.scheduledTimer(withTimeInterval: 3, repeats: true) { [unowned self] _ in
print("ContentViewModel timer fired")
self.selectedIndex = 0
}
}
}
struct ContentView: View {
@ObservedObject private var viewModel = ContentViewModel()
var body: some View {
List(self.viewModel.items) { (item: Item) in
NavigationLink(destination: Text(item.text), tag: item.id, selection: self.$viewModel.selectedIndex) {
Text(item.text)
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是控制台中记录的内容:
ContentViewModel selectedIndex = Optional(2)
ContentViewModel timer fired
ContentViewModel selectedIndex = Optional(0)
ContentViewModel selectedIndex = nil
ContentViewModel selectedIndex = nil
ContentViewModel selectedIndex = Optional(3)
ContentViewModel timer fired
ContentViewModel selectedIndex = Optional(0)
ContentViewModel selectedIndex = nil
ContentViewModel selectedIndex = nil
Run Code Online (Sandbox Code Playgroud)
我希望你们能提供任何帮助或指示!
注意:我正在运行最新版本的所有东西,Xcode 11.4、Swift 5.2、watchOS 6.2。
这看起来像是 watchOS 独有的问题,我在 iOS 上没有观察到这种行为。值得向 Apple 提交反馈。
这是可能的临时解决方法。使用 Xcode 11.4 进行测试。
self.timer = Timer.scheduledTimer(withTimeInterval: 5, repeats: true) { [unowned self] _ in
print("ContentViewModel timer fired")
self.selectedIndex = nil // << reset
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { // postpone !!
self.selectedIndex = 0 // << next
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
722 次 |
| 最近记录: |