【问题标题】: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())
      }
}

【问题讨论】:

    标签: ios swift button swiftui


    【解决方案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())
                    }}
            }
    

    【讨论】:

    • 谢谢,这可行,但如何将它们水平排序?以及单击后如何更改按钮的颜色?像堆栈溢出中的赞成按钮?谢谢
    猜你喜欢
    • 2015-01-20
    • 2022-01-09
    • 1970-01-01
    • 2017-03-21
    • 1970-01-01
    • 2013-10-22
    • 2021-10-05
    • 1970-01-01
    • 2020-05-22
    相关资源
    最近更新 更多