在 Swift 中使用字符分隔符查找并突出显示文本

2024-03-19

我之前开发了一个 Android 应用程序,作为用户的参考指南。它使用 sqlite 数据库来存储信息。数据库存储不带格式的 UTF-8 文本(即粗体或下划线)

为了突出显示文本的哪些部分需要格式化,我使用分隔符标记(特别是 $$)将它们括起来,因为这不会作为信息出现在数据库中。在向用户显示文本之前,我编写了一个方法来查找这些分隔符并向其中包含的文本添加格式并删除分隔符。所以 $$foo$$ 变成了foo.

我的java代码如下:

private static CharSequence boldUnderlineText(CharSequence text, String token) {
    int tokenLen = token.length();
    int start = text.toString().indexOf(token) + tokenLen;
    int end = text.toString().indexOf(token, start);

    while (start > -1 && end > -1)
    {
        SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(text);
        //add the formatting required
        spannableStringBuilder.setSpan(new UnderlineSpan(), start, end, 0);
        spannableStringBuilder.setSpan(new StyleSpan(Typeface.BOLD), start, end, 0);

        // Delete the tokens before and after the span
        spannableStringBuilder.delete(end, end + tokenLen);
        spannableStringBuilder.delete(start - tokenLen, start);
        text = spannableStringBuilder;

        start = text.toString().indexOf(token, end - tokenLen - tokenLen) + tokenLen;
        end = text.toString().indexOf(token, start);
    }

    return text;
}

我已经在 Swift for iOS 中重新创建了我的应用程序,除了显示正确的格式之外,它是完整的。看来 Swift 处理字符串的方式与其他语言不同。

到目前为止,我已经尝试对原始未格式化段落使用 NSString 和 String 类型,并设法获取第一个分隔符的范围、开始和结束索引:

func applyFormatting2(noFormatString: NSString, delimiter: String){
    let paragraphLength: Int = noFormatString.length //length of paragraph
    let tokenLength: Int = delimiter.characters.count //length of token

    let rangeOfToken = noFormatString.rangeOfString(formatToken) //range of the first delimiter
    let startOfToken = rangeOfToken.toRange()?.startIndex //start index of first delimiter
    let endOfToken = rangeOfToken.toRange()?.endIndex //end index of first delimiter

    var startOfFormatting = endOfToken //where to start the edit (end index of first delimiter)



}

OR

func applyFormatting(noFormatString: String, token: String){
    let paragraphLength: Int = noFormatString.characters.count
    let tokenLength: Int = token.characters.count   //length of the $$ Token (2)
    let rangeOfToken = noFormatString.rangeOfString(formatToken)    //The range of the first instance of $$ in the no format string
    let startOfToken = rangeOfToken?.startIndex //the starting index of the found range for the found instance of $$
    let endOfToken = rangeOfToken?.endIndex //the starting index of the found range for the found instance of $$


    var startOfFormatting = endOfToken
}

我很欣赏这段代码冗长且具有毫无意义的变量,但它可以帮助我在解决问题时思考我的代码。

我目前正在努力研究如何找到第二个/结束分隔符。我想从特定索引搜索字符串,就像我在 Java 中使用该行所做的那样

int end = text.toString().indexOf(token, start);

但是我无法弄清楚如何使用范围来做到这一点。

谁能帮我解决如何正确识别结束分隔符的位置或如何完成代码块以格式化所有必需的文本?

Thanks

Aldo


使用 NSRegularExpression 怎么样?

public extension NSMutableAttributedString {
    func addAttributes(attrs: [String : AnyObject], delimiter: String) throws {
        let escaped = NSRegularExpression.escapedPatternForString(delimiter)
        let regex = try NSRegularExpression(pattern:"\(escaped)(.*?)\(escaped)", options: [])

        var offset = 0
        regex.enumerateMatchesInString(string, options: [], range: NSRange(location: 0, length: string.characters.count)) { (result, flags, stop) -> Void in
            guard let result = result else {
                return
            }

            let range = NSRange(location: result.range.location + offset, length: result.range.length)
            self.addAttributes(attrs, range: range)
            let replacement = regex.replacementStringForResult(result, inString: self.string, offset: offset, template: "$1")
            self.replaceCharactersInRange(range, withString: replacement)
            offset -= (2 * delimiter.characters.count)
        }
    }
}

这是你如何称呼它。

let string = NSMutableAttributedString(string:"Here is some $$bold$$ text that should be $$emphasized$$")
let attributes = [NSFontAttributeName: UIFont.boldSystemFontOfSize(15)]
try! string.addAttributes(attributes, delimiter: "$$")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Swift 中使用字符分隔符查找并突出显示文本 的相关文章

  • C 支持原始字符串吗?

    C 11 添加了对原始字符串文字的支持 例如 R foo A weird string foo C有这样的东西吗 如果有 标准是什么版本 C11 如果没有 有谁知道它是否正在计划中以及是否有编译器支持它 C有这样的东西吗 如果有 标准是什么
  • HTML 分页

    有没有html分页的开源项目 我正在为 iPhone 开发一个应用程序 我想在 UIWebView 上显示 HTML 文件 并且不希望用户向下滚动以查看屏幕上未显示的剩余内容 我想在第二个 UIWebView 上显示剩余的内容 我怎样才能做
  • 如何向 UIView 添加大小调整手柄?

    我试图根据用户请求在运行时动态创建视图 UIImageView 和 UITextView 然后允许用户移动它们并调整它们的大小 除了调整大小之外 我的一切都工作得很好 我尝试使用捏合手势识别器 但发现它对于我想要的东西来说太笨拙了 因此 我
  • 如何右对齐 UILabel?

    Remark 实施 myLabel textAlignment right does not解决了我的问题 这不是我所要求的 我想要实现的是让标签对齐右对齐 为了更清楚地说明 这就是如何left对齐外观 就是这样justify对齐外观 if
  • 通过 renderInContext 定位要绘制的视图:

    我想画一个UIView在我目前的CGGraphicsContext 我画的是UIView via renderInContext 但它的位置不正确 始终位于左上角 我拥有所有的价值观UIView可用于绘制UIView CGRect fram
  • git 匹配多个单词的标签

    我们可以得到最后一个 git 标签 它以一个单词 例如 TEST 开头 如下所示 git describe tag dirty match TEST 我想知道如何获得最后一个以 word1 开头的标签orword2 例如测试OR跑步 我尝试
  • 调用 SwiftUI 中位置 #11、#12 处的额外参数 [重复]

    这个问题在这里已经有答案了 我在 SwiftUI 中的切换开关上不断收到 调用中位置 11 12 处有额外参数 错误 我见过其他人有 调用中的额外参数 错误 但答案似乎没有帮助 另外 我的错误是 位置 11 12 我还没有看到其他人发生这种
  • 从 iOS 13 开始安排 iOS 后台任务

    我正在实现用于更新数据的BackgroundTasks 框架 但我遇到了以下问题 无法计划刷新App 错误域 BGTaskSchedulerErrorDomain代码 1 空 无法安排数据提取 Error Domain BGTaskSche
  • 从 Mac 命令行访问 iOS 应用程序目录(沙箱)

    我需要使用 Mac 或 Linux 上的命令行 非 GUI 访问 iOS 设备上安装的应用程序的沙箱目录 这有助于开发和测试自动化 将 json 文件放入沙箱中可以让我设置参数 例如额外的调试消息和更小的刷新间隔 像 iFunBox 这样的
  • 查找已用应用程序名称的捆绑包/开发人员

    我正在尝试将应用程序上传到应用程序商店并收到以下错误 很容易理解 The App Name you have entered has already been used 该应用程序不在 iTunes 上 有什么方法可以找出谁拥有该应用程序或
  • 以弯曲格式显示文本

    我正在寻找以曲线格式绘制一些文本 我使用哪个控件并不重要 UITextField UILabel or UITextView 我只想显示如图所示的文本 仍在寻找解决方案 请帮忙 查看此链接 https nodeload github com
  • 字符串中的注释和注释中的字符串

    我正在尝试使用 Python 和 Regex 计算 C 代码中包含的注释中的字符数 但没有成功 我可以先删除字符串以删除字符串中的注释 但这也会删除注释中的字符串 结果会很糟糕 是否有机会通过使用正则表达式来询问不匹配注释中的字符串 反之亦
  • 如何在Python中按AaB而不是ABa顺序对字符串进行排序

    我正在尝试对字符串进行排序 为 punnetsquare 制作基因型 我目前的实现是 unsorted genotype ABaB sorted genotype sorted list unsorted genotype sorted s
  • 可以获取位置,但无法获取航向

    我目前只使用模拟器 但我在 iOS 模拟器上快速使用 CoreLocation 时遇到问题 我得到此代码打印的位置更新 但从未得到标题 我不想当然 我正在尝试制作一个指南针类型的应用程序 它将显示目标的方位 class CompassVie
  • iOS 防止计时器 UILabel 在数字变化时“晃动”

    我有一个UILabel它以以下格式显示计时器的输出MM ss SS 分 秒 厘秒 但是随着厘秒宽度的变化 它从左向右 摇动 例如 11 比 33 窄 有什么办法可以减轻这种情况吗 我尝试过将其居中 给它固定的宽度 但它们似乎没有帮助 从iO
  • XCode 4.5 给我“SenTestingKit/SenTestKit.h”文件未找到,但适用于 4.4.1

    我刚刚安装了 XCode 4 5 它在我现有的项目之一上给了我一个 SenTestingKit SenTestingKit h 文件未找到错误 此错误仅发生在 XCode 4 5 中 但它在 4 4 1 上编译正常 我已经检查过SenTes
  • ios - 在哪里放置 s.static_framework = true

    我在 CocoaPods 中的级别为 0 当我使用pod install有一个错误说 The Pods App target has transitive dependencies that include static framework
  • string.Compare 行为

    怎么会这样呢 这是从VS2008中的立即窗口获取的 string Compare 1 string Compare 0 0 1 从言论来看字符串比较 http msdn microsoft com en us library 84787k2
  • iOS 视图控制器内存在被关闭后未释放

    当用户单击按钮时 它会显示一个带有两个视图控制器的新选项卡栏视图控制器 我是这样做的 ACLevelDownloadController dvc ACLevelDownloadController alloc initWithNibName
  • 设置/覆盖 UICollectionView 中单元格之间的填充

    我有一个 UICollectionView 但在获取单元格之间的填充时遇到了问题 理论上 我应该能够将屏幕除以 4 并且我可以获得包含 4 个图像的单元格大小 完美地占据屏幕宽度 但是 它选择不这样做 相反 它会创建 3 个具有巨大填充的图

随机推荐

  • 如何在 Python 中写入原始二进制数据?

    我有一个 Python 程序 可以存储数据并将数据写入文件 数据是原始二进制数据 内部存储为str 我正在通过 utf 8 编解码器将其写出来 但是 我得到UnicodeDecodeError charmap codec can t dec
  • 使用 ASP.Net 2.0 创建 SOAP 请求

    我正在与服务器网站的技术联系人交谈 他希望我使用 Visual Studio 而我只想手写脚本 请参阅下文了解我需要生成的 SOAP 请求 我已将实际 URL 替换为虚拟 URL 正如您可能猜到的那样 我对 ASP 和 SOAP 还很陌生
  • Wagtail 文档:大文件(>2GB)上传失败

    我正在尝试使用 Wagtail 应用程序中内置的 wagtaildocs 应用程序上传文件 我已经使用 Nginx 的 Digital Ocean 教程方法设置了 Ubuntu 16 04 服务器 鳐鱼 Postgres 一些初步澄清 在我
  • 包签名与之前安装的版本不匹配

    这是我的项目 https github com kenpeter my hak news https github com kenpeter my hak news 它是直接复制https github com grigio HAgnost
  • Google Map API V3.0 - 如何检测 MapTypeId 更改

    要添加侦听器来检测缩放更改 请执行以下操作 google maps event addListener map zoom changed function 检测地图类型变化的代码是什么ROADMAP到另一个视图 例如SATELLITE 我可
  • .net/C# 中的网络

    有人可以为我指明学习如何在 C net 3 5 中进行网络连接的正确方向吗 欢迎提供代码示例和解释 基本上我正在寻找如何进行异步 多线程服务器 客户端模型 我对如何使用 WinSock 在 C 中实现这一点的基础知识相当满意 但尽管我所有的
  • 检测 osx 何时睡眠/从睡眠中恢复

    是否可以编写一个 python 程序 我认为我将作为守护进程运行 来检测 osx 何时进入睡眠状态以及何时从睡眠状态恢复 如果听起来我没有研究过这一点 我很抱歉 我已经超出了我的舒适区 不确定我是否需要从 python 委托给用 C 编写的
  • 如何在Python中以相同比例在同一图形上绘制两个3D矩阵图

    我有两个矩阵 我希望在同一个图上的两个子图上有相应的两个 3D 图 并且具有相同的 z 轴 到目前为止 这是我的代码 import numpy as np import matplotlib pyplot as plt from mpl t
  • 奇怪的海湾合作委员会行为

    给出以下 C 代码 struct vertex type float x y z vertex type vertex type float x float y float z x x y y z z typedef struct vert
  • 如何将包安装到 conda 创建的特定 virtualenv 中 [重复]

    这个问题在这里已经有答案了 我想在 conda 创建 virtualenv 后安装 python 包 但我收到以下错误 有谁知道如何将软件包安装到 conda 创建的 virtualenv 中 Users jzhang anaconda l
  • Java中的ConcurrentHashMap?

    有什么用ConcurrentHashMap在Java中 它有什么好处 它是如何工作的 示例代码也很有用 重点是提供一个实现HashMap那是线程安全的 多个线程可以读取和写入它 而不会接收到过期或损坏的数据 ConcurrentHashMa
  • 基于声明的安全性时的 http 客户端标头授权

    我正在从使用基于声明的安全性的 MVC 应用程序调用 REST api 我将如何设置身份验证标头 我没有密码 所以我想我不应该使用 Basic 如果使用 Bearer 如何获取令牌 Client DefaultRequestHeaders
  • 向 Magento 的订阅模块添加自定义字段

    Magento 中的新闻通讯订阅模块默认只有一个字段 电子邮件 在我向表单添加额外字段 例如国家 地区 后 如何让表单数据显示在 Magento 后端并作为电子邮件发送给预设收件人 谢谢 如果您想为 Magento 新闻通讯订阅者添加一些自
  • 使用 matplotlib 绘制类似 Python 极地时钟的图

    我正在尝试使用 Python 中的 matplotlib 以顺时针方式绘制数据 其风格为这个答案 https stackoverflow com questions 25898523 how to plot points on a cloc
  • 当 AutoGenerateColumns 为 nullable bool 时,WPF DataGrid 强制绑定 DataGridCheckBoxColumn

    我们有很多DataGrid具有动态数据绑定 所以我们总是使用AutoGenerateColumns True For bool列生成一个DataGridCheckBoxColumn但对于可为 null 的 bool bool 在 C 中 生
  • C++ 中的 Utf-8:快速而肮脏的技巧

    我知道有关于 utf 8 的各种问题 主要是关于操作 utf 8 字符串 之类对象的库 然而 我正在开发一个 国际化 项目 一个网站 我在其中编写了 c 后端 不要问 即使我们处理 utf 8 我们实际上也不需要这样的库 大多数时候 简单的
  • 如何从 Google Places API 获取菜单和产品列表的数据?

    在 Google 地图上 企业可以将菜单中的产品详细信息或食品 菜肴 添加到其商店或餐厅 地点 我们如何获得这些数据 在里面Google Place Api 地点详细信息 https developers google com places
  • 无法创建新的 Spree 应用程序:“未定义方法‘raise_in_transactional_callbacks=’”

    几个月前我就遇到过这个问题将其发布到 Spree 的 GitHub 页面上 https github com spree spree issues 5448 然后自己找出解决方案并将其发布在同一问题上 两个月后 我仍然收到来自具有相同错误消
  • 防止伪元素触发悬停?

    如果我有标记 div class a b div 其中 a 类有一个与之关联的悬停类 并且 b 类有一个与之关联的伪元素 就像这样 div width 100px height 100px a background red display
  • 在 Swift 中使用字符分隔符查找并突出显示文本

    我之前开发了一个 Android 应用程序 作为用户的参考指南 它使用 sqlite 数据库来存储信息 数据库存储不带格式的 UTF 8 文本 即粗体或下划线 为了突出显示文本的哪些部分需要格式化 我使用分隔符标记 特别是 将它们括起来 因