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

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

【讨论】:

谢谢,这可行,但如何将它们水平排序?以及单击后如何更改按钮的颜色?像堆栈溢出中的赞成按钮?谢谢

以上是关于如何使字符串列表的每个元素都可点击?的主要内容,如果未能解决你的问题,请参考以下文章

如何使dango url忽略urls.py中的查询字符串

AmCharts V4:使类别轴中的每个标签都可点击,并为每个标签提供不同的功能

列表和元祖

jquery 点击使元素置顶

Contact Form 7 上的日历字段:如何使它在该字段的任何位置都可点击?

请问python如何打出这些字符串?