[英]SwiftUI NavigationLink selected value resets to nil
我有一個 SwiftUI watchOS 應用程序,它使用NavigationLink
在幾個視圖之間進行路由。 我正在使用NavigationLink
的tag
和selection
參數來控制哪個視圖可見。 在我的真實應用程序中,當用戶從復雜功能啟動應用程序時,我希望能夠導航回索引 0 處的視圖。 但是,每當$selection
值不是 nil 或 0 並且$selection
從我的視圖模型中設置為 0 時,索引 0 處的視圖會短暫顯示,然后$selection
會被 SwiftUI(兩次)重置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)
}
}
}
}
這是控制台中記錄的內容:
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
我希望你們能提供任何幫助或指示!
注意:我正在運行最新版本的所有東西,Xcode 11.4、Swift 5.2、watchOS 6.2。
它看起來像 watchOS-only 問題,我沒有在 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
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.