我有List幾個專案的觀點。然后所有這些都用于導航目的,并且都是Text. 我不能NavigationLink在這個應用程式中使用s。
也就是說,我正在通過一個@State變數監視串列選擇。
@State private var selection: String?
每當視圖更新時,我都會列印其值。id在選擇串列的不同專案時,它通常會列印每個專案的唯一性。
問題是當再次嘗試選擇相同的專案時:在這種情況下,視圖不會更新,并且我在控制臺中看不到除錯訊息。
我希望能夠按下一個串列項來顯示一個視圖,然后能夠再次按下它,盡管它已經被選中,因為我有我想要運行的邏輯(例如:手動視圖重繪 )。
如何檢測已選擇串列項的重新選擇?
如有任何問題,請告訴我。感謝您的幫助!
更新 1
這是我正在使用的代碼:
Helper list item struct:
struct NavItem {
let id: String
let text: String
}
串列:
struct NavList: View {
@Binding private var selection: String?
private var listItems: [NavItem]
//note:
//selection is a @State variable declared in a parent struct and passed here.
//This is optional. I could declare it as a @state too.
init(listItems: [NavItem], selection: Binding<String?>) {
self.listItems = listItems
self._selection = selection
debugPrint(self.selection)
}
var body: some View {
List (selection: $selection) {
ForEach(listItems, id:\.id) { item in
Text(item.text)
.tag(item.id)
}
}
}
}
注 1:我已經知道可以通過使用.onTapGesture修飾符來解決這個問題。這個解決方案似乎不是最優的。我試著在這里尋求幫助。
注2:在專案中,struct包含串列的 符合View. 當該視圖顯示時,它.listStyle(SidebarListStyle())添加了修改器。這可能是相關的。
uj5u.com熱心網友回復:
有很多方法可以做你想做的事,試試這個 .onTapGesture{..}
List (selection: $selection) {
ForEach(listItems, id: \.id) { item in
Text(item.text)
.tag(item.id)
.padding(10)
.listRowInsets(.init(top: 0,leading: 0, bottom: 0, trailing: 0))
.frame(minWidth: 111, idealWidth: .infinity, maxWidth: .infinity, alignment: .leading)
.onTapGesture {
print("----> " item.text)
}
}
}
或者您可以使用 aButton代替onTapGesture;
List (selection: $selection) {
ForEach(listItems, id: \.id) { item in
Button(action: { print("----> " item.text) }) {
Text(item.text)
}
.padding(10)
.listRowInsets(.init(top: 0,leading: 0, bottom: 0, trailing: 0))
.tag(item.id)
.frame(minWidth: 111, idealWidth: .infinity, maxWidth: .infinity, alignment: .leading)
}
}
編輯:完整的測驗代碼:
這是我在測驗中使用的代碼:
import SwiftUI
@main
struct TestApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
struct NavItem {
let id: String
let text: String
}
struct ContentView: View {
@State private var listItems: [NavItem] = [NavItem(id: "1", text: "1"),
NavItem(id: "2", text: "2"),
NavItem(id: "3", text: "3"),
NavItem(id: "4", text: "4")]
@State private var selection: String?
var body: some View {
List (selection: $selection) {
ForEach(listItems, id:\.id) { item in
Button(action: { print("----> " item.text) }) {
Text(item.text)
}
.padding(10)
.listRowInsets(.init(top: 0,leading: -5, bottom: 0, trailing: -5))
.frame(minWidth: 111, idealWidth: .infinity, maxWidth: .infinity, alignment: .leading)
.tag(item.id)
.background(Color.red) // <--- last modifier
}
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/317314.html
