2015-09-05 3 views
0

У меня есть UITextView в моем приложении, которое обновляется как пользовательский тип. Но когда я начинаю вводить UITextView, курсор начинает мерцать и быстро перемещаться вверх и вниз. Как я могу исправить эту ошибку?Курсор перемещается вверх и вниз

Это как UITextView является update-

Cocoa Touch класса файл с именем Highlighter.swift-

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 
    } 

} 

    } 
+0

Вы программно изменяете рамки UITextView? – Dalvik

+0

@RahulMishra Я не меняю рамку, меняю цвет текста текста. Да, это делается программно. –

+0

NSRange проблема. Не могу сказать больше, потому что снова вопрос без кода или какой-либо иллюстрации. –

ответ

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) 
      } 
     } 
    } 
} 
+0

не работает. Курсор все еще вибрирует и перемещается вверх и вниз. –

+0

Вы можете узнать больше, получив 'print()' из 'myTextView.selectedRange' в разные моменты. Если есть прыжки в значениях, которые не вызваны входом, вы, по крайней мере, сейчас, какой бит вызывает все это. –

+0

Это то, что заставляет курсор действовать в этом странном стиле: 'self.myTextView.attributedText = self.syntaxHighLighter.highlightedString' Но я не думаю, что смогу устранить это право? –

Смежные вопросы