ios - macOS 上的 SwiftUI,如何使整行可点击?
问题描述
我有一个要呈现为List
可点击按钮的字符串列表。
但是,使用下面的代码,当我想要整个内容时,只有该行的文本是可点击的。
我不太确定我在这里做错了什么,但我希望得到一些帮助。
谢谢!
List {
ForEach(sites, id: \.self) { site in
Button(action: {
self.selectedSite = site
}) {
// TODO: Make this whole row clickable.
HStack {
Text(site)
if let selectedSite = self.selectedSite, selectedSite == site {
Spacer()
Button(action: self.removeFromList) {
Text("Remove")
}
.background(Color.black)
.foregroundColor(.white)
.cornerRadius(6)
}
}
}
.frame(maxWidth: .infinity, alignment: .leading)
.padding(.horizontal, 10)
.padding(.vertical, 8)
.buttonStyle(PlainButtonStyle())
.font(.system(size: 15))
.foregroundColor(selectedSite == site ? .white : .white)
.background(selectedSite == site ? Color.blue : nil)
.cornerRadius(6)
}
}
解决方案
问题是 whenselectedSite
是 nil,那么你只显示Text(site)
在HStack
... 你错过了 all-important Spacer()
。如果您添加一个.background(Color.red)
.
HStack {
Text(site)
if let selectedSite = self.selectedSite, selectedSite == site {
Spacer()
Button(action: {}) {
Text("Remove")
}
.background(Color.black)
.foregroundColor(.white)
.cornerRadius(6)
}
}
.background(Color.red)
看看当没有 时selectedSite
,HStack
(红色区域)很小并且只占用 的空间Text
?但是,当有a时selectedSite
,HStack
扩展以填充整行?要修复,请尝试以下操作:
- 移动
Spacer
外部,if let selectedSite
使其始终存在。 - 用于
contentShape
使Spacer
可点击的区域占据。
HStack {
Text(site)
Spacer() /// 1.
if let selectedSite = self.selectedSite, selectedSite == site {
Button(action: {}) {
Text("Remove")
}
.background(Color.black)
.foregroundColor(.white)
.cornerRadius(6)
}
}
.contentShape(Rectangle()) /// 2.
结果(在 iPhone 上测试,但在 macOS 上应该是相同的结果):
推荐阅读
- vba - 将单元格值与 VBA 中的多个值的范围进行比较
- laravel - 按数组顺序附加数据透视表 id
- c# - 我的服务堆栈服务中的异常没有将消息移动到死信队列
- encryption - OpenResty lua-resty-string:无法解密由 Crypto-JS 加密的密码(AES 默认)
- java - 如何使用其他 DTO 来减少 Spring Boot 中的 if 语句
- ios - 检查哪个 UIScrollView 正在滚动?
- travis-ci - Travic CI 提交失败(coverage_clover XML 文件不可读)
- teamcity - TeamCity 正在用星号替换特定短语
- cassandra - 使用 Cassandra 表作为键值对的正确做法是什么。并对该表执行批量读写
- javascript - Highcharts 图例显示异常管道