如何使用 NavigationLink 在 SwiftUI 中创建文本(仅文本中的一些单词)

2024-04-16

我正在开发适用于 iOS 的 SwiftUI 应用程序。 我想以这种方式格式化文本,其中蓝色单词应该是导航链接。文本应该如何显示:

我知道可以将 UIKit 实现到 SwiftUI 代码中。但是,我不明白如何以这种方式使用 UIKit 和正常工作的 NavigationLinks。


Using 这个问题 https://stackoverflow.com/questions/57510093/swiftui-how-to-have-hstack-wrap-children-along-multiple-lines-like-a-collectio作为基础,这是一个解决方案。左对齐只是一种方法。

import SwiftUI
struct DynamicLinkTextView: View {
    let text: String = "I want text like this, with NavigationLinks to another View. However, this doesn't work"
    let wordsWLinks: [String] = ["this", "View"]
    @State var selection: String?
    var textArray: [String]{
        text.components(separatedBy: " ")
    }
    var body: some View {
        NavigationView{
            VStack{
                MultilineHStack(textArray){ text in
                    VStack{
                        if wordsWLinks.contains(text.removePunctiation()){
                            NavigationLink(text + " ", destination: Text("link =  \(text)"), tag: text as String, selection: $selection)
                        }else{
                            Text(text + " ").fixedSize()
                        }
                    }
                }
            }
        }
    }
}
//https://stackoverflow.com/questions/57510093/swiftui-how-to-have-hstack-wrap-children-along-multiple-lines-like-a-collectio
public struct MultilineHStack: View {
    struct SizePreferenceKey: PreferenceKey {
        typealias Value = [CGSize]
        static var defaultValue: Value = []
        static func reduce(value: inout Value, nextValue: () -> Value) {
            value.append(contentsOf: nextValue())
        }
    }
    
    private let items: [AnyView]
    @State private var sizes: [CGSize] = []
    
    public init<Data: RandomAccessCollection,  Content: View>(_ data: Data, @ViewBuilder content: (Data.Element) -> Content) {
        self.items = data.map { AnyView(content($0)) }
    }
    
    public var body: some View {
        GeometryReader {geometry in
            ZStack(alignment: .topLeading) {
                ForEach(self.items.indices) { index in
                    self.items[index].background(self.backgroundView()).offset(self.getOffset(at: index, geometry: geometry))
                }
            }
        }.onPreferenceChange(SizePreferenceKey.self) {
            self.sizes = $0
        }
    }
    
    private func getOffset(at index: Int, geometry: GeometryProxy) -> CGSize {
        guard index < sizes.endIndex else {return .zero}
        let frame = sizes[index]
        var (x,y,maxHeight) = sizes[..<index].reduce((CGFloat.zero,CGFloat.zero,CGFloat.zero)) {
            var (x,y,maxHeight) = $0
            x += $1.width
            if x > geometry.size.width {
                x = $1.width
                y += maxHeight
                maxHeight = 0
            }
            maxHeight = max(maxHeight, $1.height)
            return (x,y,maxHeight)
        }
        if x + frame.width > geometry.size.width {
            x = 0
            y += maxHeight
        }
        return .init(width: x, height: y)
    }
    
    private func backgroundView() -> some View {
        GeometryReader { geometry in
            Rectangle()
                .fill(Color.clear)
                .preference(
                    key: SizePreferenceKey.self,
                    value: [geometry.frame(in: CoordinateSpace.global).size]
                )
        }
    }
}
struct DynamicLinkTextView_Previews: PreviewProvider {
    static var previews: some View {
        DynamicLinkTextView()
    }
}
extension String{
    func removePunctiation() -> String {
        self.trimmingCharacters(in: CharacterSet(charactersIn: ",."))
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 NavigationLink 在 SwiftUI 中创建文本(仅文本中的一些单词) 的相关文章

随机推荐

  • HttpContext.GetOwinContext().GetUserManager() 返回 null

    我使用 ASP NET Identity 2 创建角色 但结果是HttpContext GetOwinContext GetUserManager
  • 如何在Matlab中向结构体数组添加新元素?

    如何向结构体数组添加新元素 我无法连接空结构 gt gt a struct gt gt a f1 hi a f1 hi gt gt a f2 bye a f1 hi f2 bye gt gt a cat 1 a struct Error u
  • QT:QFileSystemModel _q_fileSystemChanged 插槽在 UI 线程上执行,这与文档相矛盾

    我的 UI 使用 QTreeView 和 QFileSystemModel 来选择文件夹和文件 QFileSystemModel 的文档说文件结构更新是在单独的线程上完成的 这意味着 UI 不会被阻塞 然而 对我来说情况并非如此 我无法弄清
  • 使用 QuasirandomGenerator (对于傻瓜来说)

    我是 CUDA 的新手 我正在努力在内核中生成随机数 我知道有不同的实现 而且 在 SDK 4 1 中有一个 Niederreiter 拟随机序列生成器的示例 我不知道从哪里开始 我有点悲伤 感觉自己像个傻瓜 有人可以制作一个使用 Nied
  • Zookeeper中的ensemble和quorum的区别

    我是动物园管理员的新手 我已经在一台机器上配置了它 但我在动物园管理员的文档中遇到了 ensemble 和 quorum 这两个词 谁能告诉我这些之间的区别吗 Ensemble Quorum 这个答案是给那些仍然有疑问理解的人的Ensemb
  • React 热重载不适用于 webpack 4

    反应热重载不起作用 在 webpack 条目中 我有以下代码 entry home webpack dev server client http 0 0 0 0 8000 webpack hot dev server add only de
  • Android 滚动视图在添加文本时自动滚动

    我在 Android 应用程序中有一个包含文本视图的滚动视图 此文本视图将按设定的时间间隔连续附加文本 滚动有效并且文本添加得很好 但我想做的是在添加文本时让滚动视图自动向下滚动 当新文本添加到底部时 它会自动向下滚动以匹配 而旧文本会在顶
  • 如何从 Rust 中的文件读取结构体?

    有没有办法可以直接从 Rust 文件中读取结构 我的代码是 use std fs File struct Configuration item1 u8 item2 u16 item3 i32 item4 char 8 fn main let
  • 在 Android 上启动 Chrome 作为 Web 应用程序

    我有一个非常具体的问题 我在Android平板电脑上实现了一个Web应用程序 将在一个展览上使用 Outform iDisplay 因此 Web App 必须在启动后立即启动 启动后的事情没有问题 使用 android permission
  • nginx auth_basic 时间限制

    我正在使用 nginx 和auth basic模块 但我似乎找不到一种方法来指定 身份验证 过期的时间间隔 我希望能够强制 nginx 每 6 小时询问一次密码 有没有办法做到这一点 如果不是 可接受的解决方法是什么 这可能是不可能的 似乎
  • 什么是 iOS 的渐进式 Web 应用程序解决方案 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想知道 iOS 设备的渐进式 Web 应用程序的解决方案是什么 因为他们的默认浏览器 SAFARI 尚不支持渐进式 Web 应用程序
  • 如何按嵌套属性对数组进行排序

    let array id 248439 name Cross Creek Ranch Creek Cove surveyStatus territoryName Fulshear subdivisionName Cross Creek Ra
  • 如何使用 Java 中的 Jersey 安全注释绕过 servlet 过滤器中的路径

    我已经使用 Jersey 实现了 REST 服务 为了提供更多安全性 我在 REST 方法中添加了球衣安全注释 PermitAll DenyAll 以下是我的 REST 服务示例 GET Path getall Produces Media
  • python/pandas 中的整数在 sqlite 中变成 BLOB(二进制)

    在 sqlite 中存储整数会导致 BLOB 二进制值 而不是 sqlite 中的 INTEGER 问题出在 Baujahr 列中的 INT 该表已创建 CREATE TABLE Objekt No INTEGER NOT NULL UNI
  • Ruby:通过正则表达式过滤数组?

    这对我来说是一个常见的 重复的习惯用法 使用正则表达式过滤数组 然后返回子数组 我的方法看起来不太像 Ruby 我来自 Java 我最终得到了很多看起来很像这样的方法 改进此代码的惯用 Ruby 方法是什么 def get all gifs
  • 使用 jQuery 选择 CSS 中具有 color:lightGreen 的元素

    如何选择具有属性的元素color lightGreen使用 jQuery 在 CSS 中 然后将其更改为 666 示例 HTML a class CorporateHyperlink href EstimateSite Estimate D
  • Eclipse 导出的 Runnable JAR 不显示图像

    运行从 Eclipse 导出的 JAR 文件时 我的图像不会加载 我的图像位于资源类包中 我也尝试过图像源文件夹 但没有成功 从 Eclipse 加载时工作完美 图像位于导出的 JAR 文件中 因此导出正常 我试过了 label setIc
  • 与经过验证的位置交互? - 谷歌地图

    好的 有很多Google 地图上标记的商家这些日子 但我无法以任何方式与这些互动 这是我掌握的信息 场地名称 声音部 地址 伦敦冈特街 103 号 SE1 6DP 谷歌的地理位置only给我 坐标 纬度 经度 格式化地址 我想要一个应用程序
  • 将 mysql 转换为 mysqli [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我对 My
  • 如何使用 NavigationLink 在 SwiftUI 中创建文本(仅文本中的一些单词)

    我正在开发适用于 iOS 的 SwiftUI 应用程序 我想以这种方式格式化文本 其中蓝色单词应该是导航链接 文本应该如何显示 我知道可以将 UIKit 实现到 SwiftUI 代码中 但是 我不明白如何以这种方式使用 UIKit 和正常工