【问题标题】:Multiple range on NSMutableAttributedStringNSMutableAttributedString 上的多个范围
【发布时间】:2016-12-28 14:53:27
【问题描述】:

我正在尝试在一个字符串中设置两个不同的string range 粗体字体。我知道如何通过range 做到这一点range,但是否可以一次使用多个范围。我不喜欢重复代码。

这是我的代码

if let rankString = trophy.fullRank.value {
    var secondRankString = "some string"
    var string = SRUtils.LocalizedString("unlocked.description", comment: "")
    string = String(format: string, trophy.trophiesNumber.value!, rankString)

    let atStr = NSMutableAttributedString(string: string)
    //Here i need to add rankString and other range
    let textRange = (string as NSString).range(of: rankString)

    if let font = UIFont(name: "HelveticaNeue-Bold", size: 16) {
        atStr.addAttribute(NSFontAttributeName, value: font, range: textRange)
        self.trophyDescription.value = atStr
    }
}

例如:

var string = "Hello do you need a cat" 
var rankString = "cat" 

我的代码结果:“你好,你需要一只猫”

我需要的是:

var mytring = "Hello do you need a cat"
var rankString = "cat"
var secondRankString = "need"

异常结果:“你好,你需要一只猫”

那么我怎么能在 swift 3 中添加多个范围来应用,而不需要多个变量声明...有可能吗?

【问题讨论】:

  • 你可以写一个扩展方法,传递你想要的范围

标签: ios swift swift3


【解决方案1】:

两个或更多,使用一个 for — Edsger W. Dijkstra

这段代码

import UIKit

let string = "Hello do you need a cat"
let attributedString = NSMutableAttributedString(string: string)
if let font = UIFont(name: "HelveticaNeue", size: 16) {
    attributedString.addAttribute(NSFontAttributeName, value: font, range: NSRange(location:0, length: string.characters.count))
}

let highlightedWords = ["cat", "need"]

for highlightedWord in highlightedWords {
    let textRange = (string as NSString).range(of: highlightedWord)

    if let font = UIFont(name: "HelveticaNeue-Bold", size: 16) {
        attributedString.addAttribute(NSFontAttributeName, value: font, range: textRange)
    }
}

let label = UILabel(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
label.attributedText = attributedString
label.sizeToFit()

结果


我只是在寻找另一种没有 for 或多重声明的方法

for 循环总是可以表示为更通用的 while 循环。但我发现 for 循环更容易理解。

var highlightedWords = ["cat", "need"]

repeat {

    if let highlightedWord = highlightedWords.popLast() {
        let textRange = (string as NSString).range(of: highlightedWord)

        if let font = UIFont(name: "HelveticaNeue-Bold", size: 16) {
            attributedString.addAttribute(NSFontAttributeName, value: font, range: textRange)
        }
    }

} while highlightedWords.count > 0

【讨论】:

  • 我只是在寻找另一种没有 for 或 multiple 声明的方法,但如果不可能,谢谢您的时间
  • 为什么不想使用 for?
  • 您当然可以使用 while 循环来代替,但我看不出这是有利的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-02
  • 2019-07-18
  • 1970-01-01
  • 1970-01-01
  • 2017-10-09
  • 2012-01-16
相关资源
最近更新 更多