如何使字符串列表的每个元素都可点击?
Posted
技术标签:
【中文标题】如何使字符串列表的每个元素都可点击?【英文标题】:How to make each element of List of String clickable? 【发布时间】:2019-12-17 00:15:21 【问题描述】:我有下面的函数,它从text
为我提供hashtags
。
现在,我正在尝试让它们中的每一个都像这样可点击,但它不起作用:
for element in msg.findHashtags()
Button(action:
print("go to the hashtags view")
)
Text(element).background(Color("bg"))
.foregroundColor(.white)
.clipShape(Capsule())
【问题讨论】:
【参考方案1】:答案应该是这样的:
ForEach( msg.findHashtags(), id: \.self )element in
Button(action:
print("go to the hashtags view")
)
Text(element).background(Color("bg"))
.foregroundColor(.white)
.clipShape(Capsule())
这是自动换行的扩展模板:
struct PositionKey : PreferenceKey
static var defaultValue : [[Int]] = []
static func reduce(value: inout [[Int]], nextValue: () -> [[Int]])
let next = nextValue()
if next.count == 2 value += [next.first!]
else value.replaceSubrange(((value.count - 1) ..< value.count), with: [value.last! + next[0]])
typealias Value = [[Int]]
struct TextLink: View
let array = ["tage1111111111ddfff11111","tag2","taffffg3","tafffg4","tag4", "taffffg3","tafffg4","tag4","tag4333ddffdd333333333","ta33333333","tag4333333333333",]
var body: some View
var tempCurrentPosition : CGFloat = 0
var currentPosition : CGFloat = 0
return ZStack(alignment: .leading)
GeometryReader proxy in
HStack
ForEach( self.array.indices , id: \.self ) index in
TextTag(text: self.array[index]).fixedSize(horizontal: true, vertical: false).anchorPreference(key: PositionKey.self , value: .leading) (value: Anchor<CGPoint>) in
if currentPosition == 0 currentPosition = proxy[value].x
if proxy.size.width > (proxy[value].x - currentPosition) tempCurrentPosition = proxy[value].x
return [[index]]
currentPosition = proxy[value].x
return [[index],[]]
.transformAnchorPreference(key: PositionKey.self, value: .trailing) ( currentValue, value: Anchor<CGPoint>) in
if currentValue.count == 1
if proxy.size.width < (proxy[value].x - currentPosition)
currentPosition = tempCurrentPosition
currentValue = [currentValue.first!, []]
.opacity(0.0).overlayPreferenceValue(PositionKey.self) v -> AnyView in
return AnyView( VStack(alignment: .leading, spacing: 10)
ForEach(v , id: \.self) row in
HStack
ForEach(row , id: \.self) item in
TextTag(text: self.array[item])
.opacity(1.0)
)
struct TextTag: View
var text: String
var body: some View
Button(action:print(self.text))
Text(text).padding().background(Color.blue)
.foregroundColor(.white)
.clipShape(Capsule())
【讨论】:
谢谢,这可行,但如何将它们水平排序?以及单击后如何更改按钮的颜色?像堆栈溢出中的赞成按钮?谢谢以上是关于如何使字符串列表的每个元素都可点击?的主要内容,如果未能解决你的问题,请参考以下文章
AmCharts V4:使类别轴中的每个标签都可点击,并为每个标签提供不同的功能