2016-07-17 7 views
0

私は、新しいiMessageを作成するときと同じように、UITextFieldのスペースを緑色で分割するようにしています。私は実行時エラーを与える私のコードの部分をコメントアウトしました。スペースで区切られた文字列の変更

func textChanged(sender : UITextField) { 

    var myMutableString = NSMutableAttributedString() 

    let arr = sender.text!.componentsSeparatedByString(" ") 

    var c = 0 

    for i in arr { 

     /* 

     myMutableString.addAttribute(NSForegroundColorAttributeName, value: UIColor.greenColor(), range: NSRange(location:c,length:i.characters.count)) 

     sender.attributedText = myMutableString 

     */ 

     print(c,i.characters.count) 

     c += i.characters.count + 1 

    } 

} 
+1

あなたは実際にあなたが得ている特定のランタイムエラーを読者に伝えるべきです。コードを見るだけで何が間違っているのか把握するのは難しいかもしれません。 –

答えて

1

コードには少なくとも2つの部分を修正する必要があります。

var myMutableString = NSMutableAttributedString() 

この行は、空のNSMutableAttributedStringを作成します。コンテンツにアクセスすると、実行時エラーが発生する可能性があります。

もう1つはi.characters.countです。使用するAPIがNSStringの振る舞いに基づいている場合は、Characterベースの場所とカウントを使用しないでください。 UTF-16ベースのカウントを使用します。

さらに、これは重要ではありませんが、変数に意味のある名前のソートを使用する必要があります。

func textChanged(sender: UITextField) { 
    let text = sender.text ?? "" 
    let myMutableString = NSMutableAttributedString(string: text) 
    let components = text.componentsSeparatedByString(" ") 
    var currentPosition = 0 
    for component in components { 
     myMutableString.addAttribute(NSForegroundColorAttributeName, value: UIColor.greenColor(), range: NSRange(location: currentPosition,length: component.utf16.count)) 
     sender.attributedText = myMutableString 

     print(currentPosition, component.utf16.count) 
     currentPosition += component.utf16.count + 1 
    } 
} 

をしかし、これはあなたが期待するように動作するかどうか、このメソッドが呼び出されたときに依存します。

だから、すべてが含まれています。

+0

私は現在 'textField.addTarget(self、action:" textChanged: "、forControlEvents:UIControlEvents.EditingChanged)'から呼び出しています。これは、すべてのテキストを常にグリーンにしています...あなたは何をお勧めしますか? – Antoine

+0

現在書かれている単語を削除するif文を追加しました。 – Antoine

+0

報告をいただきありがとうございます。あなたの問題を解決したことを聞いてうれしく思います。あなたとあなたのアプリのために幸運。 – OOPer

0

空の属性付き文字列を作成しますが、テキストは決してインストールしないでください。

addAttributeリンゴ属性を文字列のテキストに呼び出します。テキストを含まない範囲に属性を適用しようとすると、クラッシュします。

アトリビュートされた文字列に非アトリビュート文字列の内容をインストールしてから、属性を適用する必要があります。あなたはおそらくあなたのforループの外線

sender.attributedText = myMutableString 

を移動する必要があることを

は注意してください。各単語に色属性を追加すると、属性付き文字列をテキストフィールドに繰り返しインストールする必要はありません。

addAttribute上のXcodeのドキュメントからこのビット:

は発生させます... NSRangeExceptionはaRangeの任意の部分は、受信機の文字の 端部を越えてある場合。

NSRangeExceptionがあなたの現在のコードに間違っているかの手がかりになる場合。あなたが得るエラーメッセージに注意を払う。彼らは通常何がうまくいかないかについての重要な手がかりを提供します。

関連する問題