2016-04-23 6 views
1

iOSのテキストフィールドの先頭にスペースバーの使用を制限したいと考えています。私は以下のロジックを使用しようとしましたが、単語間のスペースを許可していません。この場合私を助けてください。UITextView iOSでテキストの先頭にスペースを入力しないようにユーザーを停止するにはどうすればよいですか?

if self.rangeOfCharacterFromSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()) != nil { 
    return false 
} 
return true 

答えて

2

あなたは説明何をする必要がある場合は、UITextViewDelegatetextView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String)方法を使用することができます。

例:

func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool { 
    // as @nhgrif suggested, we can skip the string manipulations if 
    // the beginning of the textView.text is not touched. 
    guard range.location == 0 else { 
     return true 
    } 

    let newString = (textView.text as NSString).stringByReplacingCharactersInRange(range, withString: text) as NSString 
    return newString.rangeOfCharacterFromSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()).location != 0 
} 

まず、我々はtextViewに表示されます新しい文字列を構築します。

次に、空白、タブ、または改行文字で始まるかどうかを確認します。

もしそうなら、私たちはそうtextViewtextViewに新しいテキストを入れて、それ以外の場合。

に新しいテキストを配置しませんfalseを返します。

注:コピー貼り付け操作を処理するためにreplacementTextをチェックする代わりに、文字列全体をチェックする必要があります。


もう一つの可能​​な方法は、ユーザーが入力したテキストを制限していますが、値を使用する必要がある場合、結果のテキストをトリミングされていません。

let myText = textView.text.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()) 

編集:@ nhgrifさんのコメントに基づいた方法よりパフォーマンスにするためにguard句を追加します。

+1

この行をガードrange.location == 0 else {return true} 'の上に追加することで、これをわずかに最適化できます。 'range.location'が' 0'の場合、どういうわけか新しい文字が前面に表示されます。そうでない場合は、比較的高価な文字列操作チェックをスキップできます。 – nhgrif

+0

ありがとう@nhgrif!これは本当にクールです、私はあなたの提案に基づいて私の答えを編集しました。 –

関連する問題