3

私は次のコードを持っています。このコードでは、型の文字列を渡し、次の関数はそれをwith に"Hello|r World|g"変換し、色に変換します。配列内の各文字列を渡すときにこれを使用しました。この関数は、最後の条件に示されているように特殊文字が見つかるまでテキストに色を付けてから、テキストに色を付けます。attributedString"Hello"red"World"green

コード :

func formatAttributedString(string:String)->NSMutableAttributedString {
        var strCopy=string as NSString
        var color:UIColor=UIColor()
        var attributedString:NSMutableAttributedString!

        for var i:Int=0;i<strCopy.length-2;i++ {
            if (string[i] == "|") {
                println("|")
                var j:Int
                if string[i+1] == "r" {
                    color=UIColor(red: 249, green: 39, blue: 14, alpha: 1)
                    strCopy = strCopy.stringByReplacingOccurrencesOfString("|r", withString: "", options: NSStringCompareOptions.LiteralSearch, range: NSMakeRange(0, i + 2))
                    println("r")

                }
               else  if string[i+1] == "v" {
                    color=UIColor(red: 161, green: 153, blue: 249, alpha: 1)
                    strCopy = strCopy.stringByReplacingOccurrencesOfString("|v", withString: "", options: NSStringCompareOptions.LiteralSearch, range: NSMakeRange(0, i + 2))
                    println("v")

                }
                else if string[i+1] == "y" {
                    color=UIColor(red: 235, green: 223, blue: 145, alpha: 1)
                    strCopy = strCopy.stringByReplacingOccurrencesOfString("|y", withString: "", options: NSStringCompareOptions.LiteralSearch, range: NSMakeRange(0, i + 2))
                    println("y")
                }
                else if string[i+1] == "g" {
                    color=UIColor(red: 174, green: 227, blue: 79, alpha: 1)
                    strCopy = strCopy.stringByReplacingOccurrencesOfString("|y", withString: "", options: NSStringCompareOptions.LiteralSearch, range: NSMakeRange(0, i + 2))
                    println("g")
                }
                else if string[i+1] == "b" {
                    color=UIColor(red: 107, green: 224, blue: 240, alpha: 1)
                    strCopy = strCopy.stringByReplacingOccurrencesOfString("|b", withString: "", options: NSStringCompareOptions.LiteralSearch, range: NSMakeRange(0, i + 2))
                    println("b")
                }


                for j=i; j>=0;j-- {
                    if string[j] == " " || string[j] == "/" || string[j] == "." || string[j] == "\"" || string[j] == "\n" || string[j] == "<" || string[j] == "\t" || string[j] == "("{
                        println("/")
                        break

                    }
                }
                attributedString=NSMutableAttributedString(string: strCopy)
                attributedString.addAttribute("NSForegroundColorAttributeName", value: color, range: NSMakeRange(j, i-j))

            }
        }

次のエラーが表示されます。

「NSMutableRLEArray objectAtIndex:effectiveRange:: 範囲外」

printlnsを追加|したrので、印刷されます。助けてください、よろしくお願いします。

印刷されているため、この質問の複製ではありません。|r

4

3 に答える 3

0

iあなたのアルゴリズムは、処理された最後の文字を指すことに依存しているようです。|? に遭遇したときはいつでも? パターンでは、2 つの特殊文字を "" に置き換えることで、コピー文字列のサイズを効果的に 2 減らすことができます。

問題を解決する最も簡単な方法は、 をi=i-2呼び出すたびに追加することstrCopy.stringByReplacingOccurrencesOfString...です。

これiにより、関数の最後のコードが正しく保持されます。

理想的には、アイテムを元のバージョンから新しいバージョンに移動する機能の再構築、色の追加などを検討することをお勧めします。これにより、すべての後方検索が節約されます。

于 2015-04-14T12:49:52.537 に答える