2017-04-13 3 views
1

Ich versuche, den arabischen Text zu markieren, aber es funktioniert nicht, schließlich das Programm abgestürzt ist mit Fehler:Highlight arabischer Text mit Timer

Terminating app due to uncaught exception 'NSRangeException', reason: 'NSMutableRLEArray objectAtIndex:effectiveRange:: Out of bounds' 

mein Code:

super.viewDidLoad() 

myMutableString = NSMutableAttributedString(string: longString) 
var currentLocation = 0 
var currentLength = 0 
var char = CharacterSet.whitespaces 

let arrayOfWords = longString.components(separatedBy: char) 

for word in arrayOfWords 
{ 
    currentLength = word.characters.count 

    ranges.append(NSRange(location: currentLocation, length: currentLocation+currentLength)) 

    currentLocation += currentLength + 1 

} 


let mySelector = #selector(self.keepHighlighting) 

let timer = Timer.scheduledTimer(timeInterval:0.5, target: self, selector: mySelector, userInfo: tempLbl , repeats: true) 

timer.fire() 

} 

und Highlight Teil ist:

func keepHighlighting(timer:Timer) 
    { 

     let lbl = timer.userInfo as! UILabel 

     myMutableString.addAttribute(NSFontAttributeName, value: UIFont(name: "Al_Mushaf", size: 40.0)!, range:ranges[wordNum]) 

     myMutableString.addAttribute(NSForegroundColorAttributeName,value: UIColor.blue,range: ranges[wordNum]) 


     lbl.attributedText = myMutableString 

     wordNum = wordNum + 1 

    } 

Dieser Code funktioniert, aber ihre Indexbereich verpassen zuletzt abgestimmt ...

Antwort

0

Es sieht aus wie WordNum steigen und steigen ohne gebunden. Wenn Sie niemals den Timer stoppen oder WordNum zurücksetzen, wird dies offensichtlich am Ende des Arrays ablaufen.

Sie müssen wahrscheinlich den Timer in einer Eigenschaft und invalidate es speichern, wenn Sie bis zum Ende Ihrer Wortliste kommen.

+0

seine Arbeit.Vielen Dank –

0

Löschen Sie die timer.fire(), der Timer ist bereits geplant, wenn Sie es erstellen. Versuchen Sie auch, den Timer-Parameter in der keepHighlighting-Funktion zu löschen, und setzen Sie userInfo auf nil und rufen Sie das Etikett direkt von userInfo.

+0

Durch den Aufruf von 'timer.fire()' wird 'keepHighlighting' sofort aufgerufen, anstatt vor dem ersten Start auf 0,5 Sekunden zu warten. Dies kann das gewünschte Verhalten sein. Das Übergeben der Daten durch userInfo ist ein wenig ungewöhnlich, aber es sieht nicht so aus, als sei es die Ursache des Problems (und ist nicht falsch, nur ein wenig ungewöhnlich). –

+0

Danke für die Antwort, ich habe alle Dinge implementiert, die Sie anweisen, aber immer noch Ausgabe ist gleich .. –

+0

Was ist 'wordNum'? Du erhöhst es jede halbe Sekunde. –