如何使用 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 中创建文本(仅文本中的一些单词) 的相关文章

  • 如何覆盖应用程序中的内部框架方法(框架外部)

    在 Swift 中子类化时是否有重写内部框架方法 前任 超类 public class BarChartRenderer ChartDataRendererBase internal func drawDataSet context con
  • 手动设置时间和日期时,iOS 10 中的重复每日本地通知不会被触发?

    我正在尝试通过触发每日通知来测试 iOS 10 中的本地通知 我正在使用以下示例项目 通知UI 演示 https github com appcoda NotificationsUI Demo 该应用程序中有以下代码之一 let calen
  • 动态高度 UITableViewCell 内的动态高度 UICollectionView

    我有一个水平的UICollectionView固定到 a 的所有边缘UITableViewCell 集合视图中的项目是动态调整大小的 我想让表视图的高度等于最高集合视图单元格的高度 视图的结构如下 UI表格视图 UITableViewCel
  • SKShapeNode(circleOfRadius) 在 OSX 的 Playground 中导致“无法识别的选择器发送到类”

    以下操场会导致时间线错误 无法识别的选择器发送到类 import SpriteKit let node SKShapeNode circleOfRadius 10 截屏 https i stack imgur com rPK5J png 当
  • 快速布尔运算

    这实在令人困惑 有人有什么想法吗 let viewHasMovedToRight false initially I want this to be false then func moveViewToRight sender UIButt
  • Swift - 必须由子类覆盖的类方法

    是否有一种标准方法可以在 Swift 中创建 纯虚函数 即 一个must被每个子类覆盖 如果不是 会导致编译时错误 您有两个选择 1 使用协议 将超类定义为协议而不是类 Pro 编译时检查每个 子类 不是实际的子类 是否实现了所需的方法 C
  • 如何快速从解析中加载图像?

    我想知道是否有人可以帮助我 我是应用程序开发的新手 我正在从我的应用程序上传图像以在解析文档的帮助下毫无问题地进行解析 let imageData UIImagePNGRepresentation scaledImage let image
  • 从 AVAudioRecorder 获取分贝

    我正在尝试从 AVAudio 录音机获取分贝值 这是我目前的代码 我有一个启动录音机的方法 然后是一个读取分贝值的方法 var recorder AVAudioRecorder 全局定义的记录器 然后在此处使用 func init reco
  • 如何读取 Xcode 6.1 Instruments .trace 文件?

    我一直在尝试阅读 trace文件 我使用生成的custom仪器模板 仪器 自动机 分配 Leaks using 仪器 https developer apple com library mac documentation Developer
  • Audiokit 修剪音频

    我正在制作音频编辑应用程序 我想修剪我的音频 对于音频编辑 我使用 AudioKit 框架 但我在教程和示例中找不到如何使用此框架修剪音频 异步导出允许设置开始和结束样本 https github com AudioKit AudioKit
  • 弱变量中间为零

    弱变量什么时候变为零 weak var backgroundNode SKSpriteNode texture SKTexture image initialBackgroundImage backgroundNode position C
  • 在 Firebase 中构建聊天应用的数据

    我正在关注 Firebase 指南结构化数据 https firebase google com docs database ios structure data flatten data structures对于聊天应用程序 他们建议的结
  • 删除具有estimatedItemSize 的项目时 UICollectionView 单元格大小会调整

    我有一个简单的项目 其中的故事板仅包含一个UICollectionViewController 使用 Xcode 7 1 1 为 iOS 9 1 构建 class ViewController UICollectionViewControl
  • 在 Swift 中使用 commitEditingStyle 动态删除 UITable 部分

    我正在处理一个无法解决的问题 我有一个来自客户数据库数组的名称表 每个客户在其他数据成员中都有一个名称属性 我可以成功删除某个部分中的行 但我不能删除该部分 当该部分中的最后一行被删除时 该部分必须消失 I got NSInternalIn
  • CustomNSError 协议有什么作用以及为什么我应该采用它?

    什么是CustomNSError协议的用途以及为什么我应该采用它 Apple提供的文档仅指出 描述错误类型 具体提供域 代码和 用户信息字典 我已经在谷歌上搜索过 但找不到与我的问题相关的任何内容 每种类型都符合Error协议是隐含地桥接的
  • 如何在 Swift 中创建 UIAlertView?

    我一直在努力在 Swift 中创建 UIAlertView 但由于某种原因我无法得到正确的语句 因为我收到此错误 找不到接受提供的 init 重载 论点 我是这样写的 let button2Alert UIAlertView UIAlert
  • 快速钥匙串更新只有在第二次尝试时才起作用

    您好 我在更新存储在钥匙串中的登录信息方面遇到了 iOS 钥匙串的一个非常奇怪的问题 因此 如果没有保存的凭据 则正确运行保存函数会保存登录信息 如果登录信息已存在并且用户更新了密码 则更新功能仅正确更新密码 但是 如果登录信息存在并且我尝
  • 来自索引范围 Swift 的新数组

    我怎样才能做这样的事情 从数组中取出前 n 个元素 newNumbers numbers 0 n 目前出现以下错误 error could not find an overload for subscript that accepts th
  • 进入后台时 Alamofire 请求卡住?

    我正在使用 Alamofire 调用 Web 服务 该服务需要相当长的时间才能加载 如果应用程序进入后台 当我返回应用程序时 我会被加载程序卡住 我想这是因为调用永远不会向我的完成处理程序返回任何内容 我该如何解决这个问题 您可以使用后台抓
  • iOS 13 检查 CLLocationManager 的临时授权状态

    根据 WWDC 视频 https developer apple com videos play wwdc2019 705 https developer apple com videos play wwdc2019 705 当你要求 Al

随机推荐

  • 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 和正常工