2012-01-28 11 views
0
// self.wordTextField.text = @"32"; 
// self.wordTextField.text = [self.wordTextField.text lowercaseString]; 
// self.wordTextField.text = [self.wordTextField.text stringByReplacingOccurrencesOfString:@" " withString:@"?"]; 

NSString *removeString = @"`[email protected]#$%^&*()_+[]\\{}|;':\",./<>"; 
NSMutableSet *removeSet = [NSMutableSet set]; 
for (unsigned i = 0; i < removeString.length; i++) { 
    NSRange range; range.location = i; range.length = 1; 
    NSString *char_ = [removeString substringWithRange:range]; 
    [removeSet addObject:char_]; 
} 
for (unsigned i = 0; i < self.wordTextField.text.length; i++) { 
    NSRange range; range.location = i; range.length = 1; 
    NSString *thisLetter = [self.wordTextField.text substringWithRange:range]; 
    if ([removeSet containsObject:thisLetter]) { 
     self.wordTextField.text = [self.wordTextField.text stringByReplacingOccurrencesOfString:thisLetter 
                        withString:@""]; 
     i--; 
    } 
} 

3つのコメント行は、self.wordTextField.textが編集が変更されているときに呼び出されるメソッド内にあるため、Myメソッドが無限ループに入る原因となります。 、ループが発生します。私の質問は:なぜループや条件文の中の.text設定がこの動作を引き起こさないのでしょうか?その部分は、(ユーザ)が期待するように完全に動作します...UITextFieldを変更すると、あるケースで無限ループが発生するのはなぜですか?

+1

'+ [NSCharacterSet characterSetWithCharactersInString:]'、 ' - [NSString rangeOfCharacterFromSet:'、 ' - [NSString stringByReplacingCharactersInRange:withString:]'が役に立ちます。または、より良いのは、NSRegularExpressionです。 –

答えて

1

コードは、変更コールバックを複数回呼び出すことでループに入りますが、無効な文字がすべて削除されたときに最終的に停止するため、無限ループではありませんテキストテキストに削除する文字が含まれていない場合、ループ内のセッターは呼び出されないことに注意してください。

+0

ありがとう!私はそれがループか条件付きのためだと考えましたが、私の指をそれに置くことはできませんでした。それは有り難いです! – 404compilernotfound