连接一些字符串,每个字符串都应该可以单独单击

问题描述 投票:0回答:2

这是一段代码,一半被注释了。 在第一部分中,数组中的文本元素位于 VStack 中,每个元素都出现在新行中。但单击时,它会提供有关单击的数组元素的详细信息。 但在第二部分中,文本是串联的并且在段落中可见。但单击时无法显示单击元素的详细信息。 我只需要文本的段落表示和每个可点击的元素。

这是代码

import SwiftUI

struct ContentView: View {
    let dummyStrings = [
        "1Lorem ipsum dolor sit amet",
        "2consectetur adipiscing elit",
        "3sed do eiusmod tempor incididunt",
        "4ut labore et dolore magna aliqua",
        "5Ut enim ad minim veniam",
        "6quis nostrud exercitation ullamco",
        "7laboris nisi ut aliquip ex ea commodo consequat",
        "8Duis aute irure dolor in reprehenderit",
        "9in voluptate velit esse cillum dolore",
        "10 eu fugiat nulla pariatur"
    ]
    
    var body: some View {
        let concatenatedText = dummyStrings.joined(separator: " ")
        
        return ScrollView {
            Text(concatenatedText)
                .font(.body)
                .foregroundColor(.blue)
                .lineSpacing(5)
                .onTapGesture {
                    // Handle tap gesture here (e.g., print tapped portion)
                    print("Text tapped")
                }
                .padding()
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
swift swiftui text swiftui-ontapgesture
2个回答
2
投票

一种方法是将所有字符串连接到

AttributedString
中,其中每个字符串都有一个与之关联的
link
link
将是一个
URL
,其中包含您想要在其中编码的任何信息。然后,您可以拦截
openURL
操作并运行您想要的任何代码。

例如,如果你想将字符串本身编码为URL的路径

func encodeIntoAttributedString(_ str: String) -> AttributedString {
    var attrStr = AttributedString(str)
    attrStr.link = URL(filePath: str)
    return attrStr
}

使用这样的东西将所有东西连接在一起:

extension Array where Element == AttributedString {
    func joined(separator: AttributedString = "") -> AttributedString {
        guard let first else { return "" }
        var result = first
        for elem in self[1...] {
            result += separator
            result += elem
        }
        return result
    }
}

用途:

let text = [
    "1Lorem ipsum dolor sit amet",
    "2consectetur adipiscing elit",
    "3sed do eiusmod tempor incididunt",
    "4ut labore et dolore magna aliqua",
    "5Ut enim ad minim veniam",
    "6quis nostrud exercitation ullamco",
    "7laboris nisi ut aliquip ex ea commodo consequat",
    "8Duis aute irure dolor in reprehenderit",
    "9in voluptate velit esse cillum dolore",
    "10 eu fugiat nulla pariatur"
].map(encodeIntoAttributedString).joined(separator: " ")

var body: some View {
    ScrollView {
        Text(text)
            // these modifiers could also be replaced by adding the corresponding attributes in encodeIntoAttributedString
            .font(.body)
            .foregroundColor(.blue)
            .lineSpacing(5)
            .padding()
            .environment(\.openURL, OpenURLAction { x in
                // here I am printing the string itself, which is encoded in the path
                print(x.path(percentEncoded: false))
                return .handled
            })
    }
}

0
投票
  var body: some View {
    ScrollView {
        HStack(alignment: .top, spacing: 0) {
            ForEach(dummyStrings.indices, id: \.self) { index in
                Text(dummyStrings[index])
                    .foregroundColor(.blue)
                    .onTapGesture {
                        print("Tapped on: \(dummyStrings[index])")
                    }
                    + Text(index < dummyStrings.count - 1 ? " " : "")
            }
        }
        .font(.body)
        .lineSpacing(5)
        .padding()
    }
}

试试这个

© www.soinside.com 2019 - 2024. All rights reserved.