Swift - NSMutableAttributedString更改UITextView中的所有文本

时间:2016-11-21 13:05:20

标签: ios swift uitextview nsattributedstring

下载我创建的示例

Example Link

我正在添加一个指向我的UITextView的链接:

 let systemFont = self.text.font!
 let linkAttributes = [
          NSFontAttributeName : systemFont,
          NSLinkAttributeName: NSURL(string: alertController.textFields![0].text!)!] as [String : Any]

 let myAttributes2 = [ NSForegroundColorAttributeName: customGreen]

 let attributedString = NSMutableAttributedString(string: "\(urlName)")

 // Set the 'click here' substring to be the link
 attributedString.setAttributes(linkAttributes, range: NSMakeRange(0, urlName.characters.count))//(0, urlName.characters.count))

 self.text.linkTextAttributes = myAttributes2
 self.text.textStorage.insert(attributedString, at: self.text.selectedRange.location)

 let cursor = NSRange(location: self.text.selectedRange.location + "\(urlName)".characters.count, length: 0)
 self.text.selectedRange = cursor
 // self.text.font = systemFont

但是在插入之后,它会将UITextView中的所有当前文本更改为相同的字体。

例如,如果我有一些Bold的文本和一些Italic的文本,在我添加url(系统字体)后,它会将所有粗体/斜体文本重置为系统字体.... / p>

如果有人知道如何保留以前文字的当前字体,我真的很感激帮助。

如需进一步说明,请在下方发表评论!

非常感谢任何有帮助的人!

更新

我正在更改textDidChange

中的文字
  if text == " " 
  {
       //      let systemFont = self.text.font!
       //    let linkAttributes = [NSFontAttributeName : systemFont]
       let attributes = [NSForegroundColorAttributeName: UIColor.black, NSFontAttributeName: self.text.font!] as [String : Any]

       let attributedString = NSMutableAttributedString(string: text, attributes: attributes)
       self.text.textStorage.insert(attributedString, at: range.location)
       let cursor = NSRange(location: self.text.selectedRange.location+1, length: 0)
       textView.selectedRange = cursor
       return false
 }

我已经这样了,所以在添加URL之后我创建了一个空格并重置了字体,所以我不会继续输入作为URL链接...可能是问题但是当我键入正常并且没有设置一个网址链接文本在创建空格时不会改变...

1 个答案:

答案 0 :(得分:4)

let urlName = "google"

@IBAction func btnPressed(_ sender: Any) {

   let systemFont = UIFont.systemFont(ofSize: 11)
   let linkAttributes = [
        NSFontAttributeName : systemFont,
        NSLinkAttributeName: NSURL(string: "https://www.google.com")!] as [String : Any]

   let myAttributes2 = [NSForegroundColorAttributeName: UIColor.green]

   let attributedString = NSMutableAttributedString(string: "\(urlName)")

   attributedString.setAttributes(linkAttributes, range: NSMakeRange(0, urlName.characters.count))//(0, urlName.characters.count))

   self.text.linkTextAttributes = myAttributes2
   self.text.textStorage.insert(attributedString, at: self.text.selectedRange.location)

   let cursor = NSRange(location: self.text.selectedRange.location + "\(urlName)".characters.count, length: 0) 
   self.text.selectedRange = cursor
}

如果要以编程方式添加文本,应该如何更新textView。 在这种情况下,请勿使用textViewDidChange(_ :)委托方法。

<强>更新

我已从Dropbox下载了您的代码并对其进行了一些更改。 所以我在这里更改viewDidLoad()中的textView文本。 我已经创建了两个常量,以便在代码中再次使用它们,fontAttr是原始字体,其名称和大小是fontColorAttrBlue是原始字体颜色。

let fontAttr = UIFont(name: "Helvetica-Bold", size: 20)
let fontColorAttrBlue = UIColor.blue

override func viewDidLoad() {
    super.viewDidLoad()

    let attrString = NSMutableAttributedString(string: "Hello World, How are you?", attributes: [NSFontAttributeName : fontAttr!, NSForegroundColorAttributeName: fontColorAttrBlue ])
    self.textView.delegate = self // you can set the delegate from the storyboard.
    self.textView.attributedText = attrString
}

我已从self.textView.font = systemFont操作方法中删除了这行代码webLink(_ sender: AnyObject),因此它不会更改textView的字体。

最后在textView(_:shouldChangeTextIn:replacementText:)方法而不是检查用户是否已输入" "字符串我检查用户是否输入了任何字符串并重新使用我在开头创建的字体属性,如果用户在链接后输入任何类型的文本,它将是原始文本,而不是为相似文本分配的文本。

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
    if text.characters.count > 0 {
        let attributedString = NSMutableAttributedString(string: text, attributes: [NSFontAttributeName : self.fontAttr!, NSForegroundColorAttributeName: self.fontColorAttrBlue])
        self.textView.textStorage.insert(attributedString, at: range.location)
        let cursor = NSRange(location: self.textView.selectedRange.location+1, length: 0)
        textView.selectedRange = cursor
        return false
    }
    return true
}