2012-07-11 14 views
11

誰かがこれが本当に毎回評価される理由を教えてもらえますか?電話番号のNSTextCheckingResult

入力はjkhkjhkjです。私がphoneフィールドに入力する内容は問題ではありません。それは本当のすべての時間だ...ここ

NSRange range = NSMakeRange (0, [phone length]);  
NSTextCheckingResult *match = [NSTextCheckingResult phoneNumberCheckingResultWithRange:range phoneNumber:phone]; 
if ([match resultType] == NSTextCheckingTypePhoneNumber) 
{ 
    return YES; 
} 
else 
{ 
    return NO; 
} 

matchの値である:

(NSTextCheckingResult *) $4 = 0x0ab3ba30 <NSPhoneNumberCheckingResult: 0xab3ba30>{0, 8}{jkhkjhkj} 

私は正規表現とNSPredicateを使用していたが、私はiOS4をするので、NSTextCheckingResultを使用することをお勧めしますことを読みましたが、私はできますこれに関する良いチュートリアルや例が見つかりません。

ありがとうございます!

+0

"推奨"どのようなシナリオですか?特定のテキストが電話番号かどうかを確認するために、この方法は実際には役に立たない。 – darkheartfelt

+0

詳細を述べる - 私は受け入れられた答えに "333-3333-3"(有効な電話番号の長さではない)を渡すことができ、成功します。 – darkheartfelt

答えて

37

クラスを誤って使用しています。 NSTextCheckingResultは、NSDataDetectorまたはNSRegularExpressionによって行われるテキスト検査の結果です。代わりにNSDataDetectorを使用してください:

NSError *error = NULL; 
NSDataDetector *detector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypePhoneNumber error:&error]; 

NSRange inputRange = NSMakeRange(0, [phone length]); 
NSArray *matches = [detector matchesInString:phone options:0 range:inputRange]; 

// no match at all 
if ([matches count] == 0) { 
    return NO; 
} 

// found match but we need to check if it matched the whole string 
NSTextCheckingResult *result = (NSTextCheckingResult *)[matches objectAtIndex:0]; 

if ([result resultType] == NSTextCheckingTypePhoneNumber && result.range.location == inputRange.location && result.range.length == inputRange.length) { 
    // it matched the whole string 
    return YES; 
} 
else { 
    // it only matched partial string 
    return NO; 
} 
+0

私はまさにそのことを書こうとしていました! –

+0

ありがとうございました!そのような例は私が探していたものとまったく同じでした。 – Chris

+0

これは機能しました。大きな助け。 –