Swiftui 如何在 foreach 循环中对整行使用点击手势
Swiftui How can you use on Tap Gesture for entire row in a foreach loop
我现在正在创建一个从 API 获取数据的 SearchBar,以红色突出显示的文本(见下图)是我想要在点击时传递到我的 userDefault 字符串中的内容。只要我点击突出显示的红色文本,它就可以工作,当你点击该行中的任何地方时是否可以获得该值,比如白色 space ?任何建议都会很棒。
@State var model: [SearchModel]
var defaults = UserDefaults.standard
@State var isOpen: Bool = false
以上是我的状态变量和我的用户默认值。我不会显示整个代码,因为问题仅出在下面。如您所见,我的值在 foreach 中,我只想拥有它,这样如果用户单击该行的白色 space,我仍然可以执行此代码.
.onTapGesture {
isOpen = true
// I set the value here
defaults.setValue(value.name, forKey: "location")
}.fullScreenCover(isPresented: $isOpen, content: MainView.init)
上面的代码给了我正确的值,但它与文本有关
ZStack {
Color(UIColor.white)
.ignoresSafeArea()
ScrollView(showsIndicators: false) {
LazyVStack {
ForEach(model) { value in
VStack(alignment: .leading) {
HStack {
Text(value.name)
.font(.system(size: 15))
.background(Color.red)
.padding(.trailing, 10.0)
.onTapGesture {
isOpen = true
// I set the value here
defaults.setValue(value.name, forKey: "location")
}.fullScreenCover(isPresented: $isOpen, content: MainView.init)
}
HStack {
Text(value.statelong)
.foregroundColor(Color.gray)
.font(.system(size: 13))
Spacer()
}
}
VStack {
Spacer()
Divider()
}
}
}.padding(.leading, 20.0)
}
}
.listRowInsets(.none)
它仅适用于突出显示的文本,因为 onTapGesture
在文本视图中。
1.使用 HStack()
我会将 VStack
嵌入 HStack
并添加 Spacer()
填充整个区域,然后将onTapGesture
放置到HStack
,像这样:
ForEach(model) { value in
HStack{
VStack(alignment: .leading) {
HStack {
Text(value.name)
.font(.system(size: 15))
.background(Color.red)
.padding(.trailing, 10.0)
}
HStack {
Text(value.statelong)
.foregroundColor(Color.gray)
.font(.system(size: 13))
Spacer()
}
}
Spacer()
}.contentShape(Rectangle())
.onTapGesture {
isOpen = true
defaults.setValue(value.name, forKey: "location")
}.fullScreenCover(isPresented: $isOpen, content: MainView.init)
}
2。使用 ZStack()
或者您可以使用 ZStack
制作全视图背景并将 onTapGesture 放在 ZStack
,将.frame(maxWidth: .infinity)
添加到ZStack
以填充整个可用宽度,如下所示:
ForEach(model) { value in
ZStack {
VStack(alignment: .leading) {
HStack {
Text(value.name)
.font(.system(size: 15))
.background(Color.red)
.padding(.trailing, 10.0)
}
HStack {
Text(value.statelong)
.foregroundColor(Color.gray)
.font(.system(size: 13))
Spacer()
}
}
Spacer()
}.contentShape(Rectangle())
.frame(maxWidth: .infinity)
.onTapGesture {
isOpen = true
defaults.setValue(value.name, forKey: "location")
}.fullScreenCover(isPresented: $isOpen, content: MainView.init)
}
我现在正在创建一个从 API 获取数据的 SearchBar,以红色突出显示的文本(见下图)是我想要在点击时传递到我的 userDefault 字符串中的内容。只要我点击突出显示的红色文本,它就可以工作,当你点击该行中的任何地方时是否可以获得该值,比如白色 space ?任何建议都会很棒。
@State var model: [SearchModel]
var defaults = UserDefaults.standard
@State var isOpen: Bool = false
以上是我的状态变量和我的用户默认值。我不会显示整个代码,因为问题仅出在下面。如您所见,我的值在 foreach 中,我只想拥有它,这样如果用户单击该行的白色 space,我仍然可以执行此代码.
.onTapGesture {
isOpen = true
// I set the value here
defaults.setValue(value.name, forKey: "location")
}.fullScreenCover(isPresented: $isOpen, content: MainView.init)
上面的代码给了我正确的值,但它与文本有关
ZStack {
Color(UIColor.white)
.ignoresSafeArea()
ScrollView(showsIndicators: false) {
LazyVStack {
ForEach(model) { value in
VStack(alignment: .leading) {
HStack {
Text(value.name)
.font(.system(size: 15))
.background(Color.red)
.padding(.trailing, 10.0)
.onTapGesture {
isOpen = true
// I set the value here
defaults.setValue(value.name, forKey: "location")
}.fullScreenCover(isPresented: $isOpen, content: MainView.init)
}
HStack {
Text(value.statelong)
.foregroundColor(Color.gray)
.font(.system(size: 13))
Spacer()
}
}
VStack {
Spacer()
Divider()
}
}
}.padding(.leading, 20.0)
}
}
.listRowInsets(.none)
它仅适用于突出显示的文本,因为 onTapGesture
在文本视图中。
1.使用 HStack()
我会将 VStack
嵌入 HStack
并添加 Spacer()
填充整个区域,然后将onTapGesture
放置到HStack
,像这样:
ForEach(model) { value in
HStack{
VStack(alignment: .leading) {
HStack {
Text(value.name)
.font(.system(size: 15))
.background(Color.red)
.padding(.trailing, 10.0)
}
HStack {
Text(value.statelong)
.foregroundColor(Color.gray)
.font(.system(size: 13))
Spacer()
}
}
Spacer()
}.contentShape(Rectangle())
.onTapGesture {
isOpen = true
defaults.setValue(value.name, forKey: "location")
}.fullScreenCover(isPresented: $isOpen, content: MainView.init)
}
2。使用 ZStack()
或者您可以使用 ZStack
制作全视图背景并将 onTapGesture 放在 ZStack
,将.frame(maxWidth: .infinity)
添加到ZStack
以填充整个可用宽度,如下所示:
ForEach(model) { value in
ZStack {
VStack(alignment: .leading) {
HStack {
Text(value.name)
.font(.system(size: 15))
.background(Color.red)
.padding(.trailing, 10.0)
}
HStack {
Text(value.statelong)
.foregroundColor(Color.gray)
.font(.system(size: 13))
Spacer()
}
}
Spacer()
}.contentShape(Rectangle())
.frame(maxWidth: .infinity)
.onTapGesture {
isOpen = true
defaults.setValue(value.name, forKey: "location")
}.fullScreenCover(isPresented: $isOpen, content: MainView.init)
}