【问题标题】:Cursor moving up and down光标上下移动
【发布时间】: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


【解决方案1】:

检查您运行的是最新的操作系统和 Xcode。

试试这个来判断它什么时候跳跃: 您可以再次使用bool 来检查选择更改是否是由于突出显示后的重置。如果不是,您可以使用断点来查看发生了什么。

func textViewDidChangeSelection(textView: UITextView) {

   print("selection changed: \(myTextView.selectedTextRange!)")

}

这可能会有所帮助:检查 textview 的长度是否仍等于突出显示的字符串的长度。

func textViewDidChange(textView: UITextView) {

    let currentRange = myTextView.selectedRange

    syntaxHighLighter.run(myTextView.text) { (finished) -> Void in

        // if the highlighter was slower than typing, ABORT
        guard let textInUITextView = self.myTextfield.attributedText where textInUITextView.length == self.syntaxHighLighter.highlightedString.length else {
            return
        }

        self.myTextView.attributedText = self.syntaxHighLighter.highlightedString
        self.myTextView.selectedRange = currentRange
    }

}

这可能会有所帮助:它会阻止荧光笔多次运行。

class HighLighter {

    private var ranges : [SyntaxRange] = []
    var highlightedString : NSMutableAttributedString = NSMutableAttributedString()
    var syntaxDictionairy : SyntaxDictionairy

    private var running : Bool = false

    init (syntaxDictionairy_I : SyntaxDictionairy) {

        syntaxDictionairy = syntaxDictionairy_I

    }

    func run(string : String?, completion: (finished: Bool) -> Void) {

        if running == true {
            print("double action")
            return
        }

        running = true

        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
                self.running = false
                completion(finished: true)
            }
        }
    }
}

【讨论】:

  • 没用。光标仍在振动并上下移动。
  • 您可以通过在不同时刻从myTextView.selectedRange 获取print() 来了解更多信息。如果值的跳跃不是由输入引起的,那么您至少现在知道是哪位引起了这一切。
  • 这就是导致光标以这种奇怪方式行事的原因-self.myTextView.attributedText = self.syntaxHighLighter.highlightedString 但我不认为我可以消除这种情况吗?
  • 我在 iPhone 6 上测试
  • 我复制了你的github项目,因为我无法运行下载的项目,并且光标仍然在振动。如果您愿意,我可以将复制的项目邮寄给您。你可以检查一下有什么问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 2021-12-01
相关资源
最近更新 更多