【发布时间】:2015-09-05 10:47:45
【问题描述】:
我的应用中有一个 UITextView,它会随着用户输入而更新。但是当我开始在 UITextView 中输入时,光标开始闪烁并快速上下移动。如何修复此错误?
这就是 UITextView 的更新方式-
一个名为 Highlighter.swift 的 Cocoa Touch 类文件-
import Foundation
import UIKit
// text hightlighter
class SyntaxGroup {
var wordCollection : [String]
var type : String
var color : UIColor
init(wordCollection_I : [String], type_I : String, color_I: UIColor) {
wordCollection = wordCollection_I
type = type_I
color = color_I
}
}
class SyntaxDictionairy {
var collections : [SyntaxGroup] = []
}
class SyntaxRange {
var range : NSRange
var color : UIColor
init (color_I : UIColor, range_I : NSRange) {
color = color_I
range = range_I
}
}
class HighLighter {
private var ranges : [SyntaxRange] = []
var highlightedString : NSMutableAttributedString = NSMutableAttributedString()
var syntaxDictionairy : SyntaxDictionairy
init (syntaxDictionairy_I : SyntaxDictionairy) {
syntaxDictionairy = syntaxDictionairy_I
}
func run(string : String?, completion: (finished: Bool) -> Void) {
ranges = []
highlightedString = NSMutableAttributedString()
var baseString = NSMutableString()
let qualityOfServiceClass = QOS_CLASS_DEFAULT
let backgroundQueue = dispatch_get_global_queue(qualityOfServiceClass, 0)
dispatch_async(backgroundQueue) { () -> Void in
if string != nil && string != "" {
self.highlightedString = NSMutableAttributedString(string: string!)
for i in 0..<self.syntaxDictionairy.collections.count {
for iB in 0..<self.syntaxDictionairy.collections[i].wordCollection.count {
let currentWordToCheck = self.syntaxDictionairy.collections[i].wordCollection[iB]
baseString = NSMutableString(string: string!)
while baseString.containsString(self.syntaxDictionairy.collections[i].wordCollection[iB]) {
let nsRange = (baseString as NSString).rangeOfString(currentWordToCheck)
let newSyntaxRange = SyntaxRange(color_I: self.syntaxDictionairy.collections[i].color, range_I: nsRange)
self.ranges.append(newSyntaxRange)
var replaceString = ""
for _ in 0..<nsRange.length {
replaceString += "§" // secret unallowed character
}
baseString.replaceCharactersInRange(nsRange, withString: replaceString)
}
}
}
for i in 0..<self.ranges.count {
self.highlightedString.addAttribute(NSForegroundColorAttributeName, value: self.ranges[i].color, range: self.ranges[i].range)
}
}
dispatch_sync(dispatch_get_main_queue()) { () -> Void in
completion(finished: true)
}
}
}
}
这是 ViewController.swift 文件中的代码-
import UIKit
class ViewController: UIViewController, UITextViewDelegate {
@IBOutlet weak var myTextView: UITextView!
var syntaxHighLighter : HighLighter!
override func viewDidLoad() {
super.viewDidLoad()
setUpHighLighter()
myTextView.delegate = self
}
func setUpHighLighter() {
// build a dict of words to highlight
let redColor = UIColor(red: 0.5, green: 0.0, blue: 0.0, alpha: 1.0)
let blueColor = UIColor(red: 0.0, green: 0.0, blue: 0.5, alpha: 1.0)
let greenColor = UIColor(red: 0.0, green: 0.5, blue: 0.0, alpha: 1.0)
let redGroup = SyntaxGroup(wordCollection_I: ["red","bordeaux"], type_I: "Color", color_I: redColor)
let blueGroup = SyntaxGroup(wordCollection_I: ["coralblue","blue","skyblue","azur"], type_I: "Color", color_I: blueColor)
let greenGroup = SyntaxGroup(wordCollection_I: ["green"], type_I: "Color", color_I: greenColor)
let dictionairy : SyntaxDictionairy = SyntaxDictionairy()
dictionairy.collections.append(blueGroup)
dictionairy.collections.append(greenGroup)
dictionairy.collections.append(redGroup)
syntaxHighLighter = HighLighter(syntaxDictionairy_I: dictionairy)
}
func textViewDidChange(textView: UITextView) {
let currentRange = myTextView.selectedRange
syntaxHighLighter.run(myTextView.text) { (finished) -> Void in
self.myTextView.attributedText = self.syntaxHighLighter.highlightedString
self.myTextView.selectedRange = currentRange
}
}
}
【问题讨论】:
-
您是否以编程方式更改 UITextView 视图的框架?
-
@RahulMishra 我没有更改框架,我正在更改输入文本的文本颜色。是的,这是以编程方式完成的。
-
NSRange 问题。不能多说,因为又是一个没有代码或任何形式的插图的问题。
-
@RMenke 这是您为 Syntax Coloring 应用程序键入的代码。 stackoverflow.com/questions/32356321/…
-
请阅读how to ask question并更新您的问题
标签: ios swift xcode6 cursor uitextview