如何使字符串列表的每个元素可点击?

时间:2019-12-17 00:15:21

标签: ios swift button swiftui

我具有下面的功能,可以从hashtags中为我提供text

现在,我试图像这样使它们每个都可点击,但是它不起作用:

for element in msg.findHashtags(){
      Button(action: {
          print("go to the hashtags view")
      }) {
          Text(element).background(Color("bg"))
              .foregroundColor(.white)
              .clipShape(Capsule())
      }
}

1 个答案:

答案 0 :(得分: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())
}
    }

这是autoWordwrapping的扩展模板:

            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())
                }}
        }