簡體   English   中英

SwiftUI:當有`.id(UUID())`時,列表會在選擇一行時向上滾動

[英]SwiftUI: List scrolls up on selection of a row when there's `.id(UUID())`

我有一個選擇行和搜索欄的列表。 搜索欄凍結了列表,但我使用id(UUID())修復了它

它產生了另一個問題,當用戶點擊一行時,滾動跳轉到 top Sometimes, when selecting few rows it crashes with this error: precondition failure: attribute failed to set an initial value: 96

struct ContentView: View {

@ObservedObject var viewModel = ViewModel()
@State private var searchText: String = ""
@State private var selected = Set<Model>()

var body: some View {
    VStack {
        SearchBar(text: $searchText, placeholder: "Search")
        List(
            viewModel.strings.filter({ searchText.isEmpty ? true : $0.title.lowercased().contains(searchText.lowercased()) })
        , selection: $selected) { model in
            MultipleSelectionRow(selectedItems: self.$selected, model: model)
        }
        .id(UUID()) /// This line causes strange behaviour.
    }
  }
}

完整的項目在GitLab上可用,還有其他截屏視頻和文件,如選擇視圖、搜索欄和視圖模型。

截屏顯示跳躍滾動視圖

解決了:

最初有兩種使用列表的方法,但每種方法都有自己的錯誤。

  1. 使用 SearchBar 時,鍵盤和列表凍結。
  2. 使用.id(UUID()) 修復凍結,但它增加了另一個錯誤行為:每次選擇行時列表都會滾動到頂部。 它曾經崩潰過。

我最終使用了帶有 UIViewRepresentable 的 UITableView。 當我用 UITableView 替換 List 時,我添加了屬性@Binding var offset: CGFloat並在每次選擇行時更新它:

func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {
    offset = tableView.contentOffset.y
    return indexPath 
}

對不起,不清楚的問題,當時我的想法很清楚。 感謝您嘗試提供幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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