将NSAttributedString添加到UIBarButtonItem

5

我正在尝试在我的后退按钮上设置富文本字符串。
这是我第一次尝试使用富文本字符串。
以下是代码:

    self.navigationItem.hidesBackButton = true
    let barButtonBackStr = "< Back"
    var attributedBarButtonBackStr = NSMutableAttributedString(string: barButtonBackStr as String)
    attributedBarButtonBackStr.addAttribute(NSFontAttributeName,
        value: UIFont(
            name: "AmericanTypewriter-Bold",
            size: 18.0)!,
        range: NSRange(
            location:0,
            length:1))
    let newBackButton = UIBarButtonItem(title: attributedBarButtonBackStr, style: UIBarButtonItemStyle.Plain, target: self, action: "barButtonBack:")
    self.navigationItem.leftBarButtonItem = newBackButton

这会在Xcode中导致以下错误。

无法使用类型为'(title: NSMutableAttributedString, style: UIBarButtonItemStyle, target: CombatOutcomeViewController, action: String)'的参数列表调用类型为'UIBarButtonItem'的初始化器

有人知道如何解决吗?谢谢。

1个回答

16

您不能直接将带属性的字符串设置给UIBarButtonItem。您需要将普通字符串设置为其标题,然后设置标题的属性:

let barButtonBackStr = "< Back"
let attributes: [NSAttributedString.Key : AnyObject] = [.font : UIFont(name: "AmericanTypewriter-Bold", size: 18)!]
let newBackButton = UIBarButtonItem(title: barButtonBackStr, style: .plain, target: self, action: "barButtonBack:")
newBackButton.setTitleTextAttributes(attributes, for: .normal)
navigationItem.leftBarButtonItem = newBackButton

这种方法有一个警告:您无法为属性设置范围,只能全选或全部不选。

要为属性定义范围,您必须创建一个UILabel,将带属性的字符串设置为其attributedText属性,然后使用自定义视图创建一个UIBarButtonItem

let barButtonBackStr = "< Back"
let attributedBarButtonBackStr = NSMutableAttributedString(string: barButtonBackStr as String)
attributedBarButtonBackStr.addAttribute(NSAttributedString.Key.font,
    value: UIFont(
        name: "AmericanTypewriter-Bold",
        size: 18.0)!,
    range: NSRange(
        location:0,
        length:1))
let label = UILabel()
label.attributedText = attributedBarButtonBackStr
label.sizeToFit()
let newBackButton = UIBarButtonItem(customView: label)
self.navigationItem.leftBarButtonItem = newBackButton
当您想使用这种方法时,您必须知道您必须将目标和操作设置为自定义视图,因为 UIBarButtonItem 不再处理它。正如苹果文档中所说的那样:
"通过此方法创建的工具栏按钮项不会在响应用户交互时调用其目标的操作方法。相反,工具栏按钮项希望指定的自定义视图处理任何用户交互并提供适当的响应。"

1
很久以前的好答案,让人们的生活变得更美好了很长一段时间... - clearlight

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接