簡體   English   中英

SwiftUI NavigationLink 選定的值重置為零

[英]SwiftUI NavigationLink selected value resets to nil

我有一個 SwiftUI watchOS 應用程序,它使用NavigationLink在幾個視圖之間進行路由。 我正在使用NavigationLinktagselection參數來控制哪個視圖可見。 在我的真實應用程序中,當用戶從復雜功能啟動應用程序時,我希望能夠導航回索引 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM