我有下面的功能,它为我提供了来自 text
的 hashtags
。
现在,我试图让它们中的每一个都像这样可点击,但它不起作用:
for element in msg.findHashtags(){
Button(action: {
print("go to the hashtags view")
}) {
Text(element).background(Color("bg"))
.foregroundColor(.white)
.clipShape(Capsule())
}
}
最佳答案
答案应该是这样的:
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())
}}
}
关于ios - 如何让 List of String 的每个元素都可以点击?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59365969/