2011-07-27 4 views

答えて

3

両方を使用できます。 fooという名前のキーについて、あなたは具体的な方法

-(BOOL)validateFoo:(id*)ioValue error:(NSError**)error { 
     ... 
} 

または、非特異的な方法

- (BOOL)validateValue:(id *)ioValue forKey:(NSString *)key error:(NSError **)outError { 
     if([key isEqualToString:@"foo"]){ 
      ... 
     }else{ 
      return [super validateValue:ioValue forKey:key error:outError]; 
     } 
    } 

を実装するか、ので、あなたは、APIドキュメントでvalidateIvar:error:を見つけられませんでしたことを完全に賢明ですキーごとにIvarの部分を変更する必要があります。システムAPIリファレンスで定義したfooのキーには、setFoo:というメソッドがありません。

+0

もちろんそうです。私は何を考えているのですか?ノービックミス。 –

+0

@Global遊牧民にはまったく問題ありません。ゆっくりと、ひとつずつ学ぶ。良いハッキング! – Yuji

+0

私はそれを考えなかったとは思えません。ありがとう、私自身の一時的な狂気から、おそらく多くの時間を想像上の問題を追いかけて私を救った。 –

0

パターンvalidate<Key>:error:の後にメソッドを実装する必要があります(これはカテゴリでも実行できます)。 validateValue:forKey:error:を上書きしないで、validateValue:forKey:error:を検証メソッド内から呼び出さないでください。無限ループが発生します。これは、Key-Value CodingのドキュメントとCore Dataのドキュメント、およびFoundationヘッダーに記載されています。 validateValue:forKey:error:は、CoreDataのようなフレームワークとアプリケーションの両方について、検証の指定エントリポイントです。

を実行したいコードはカスタム検証方法ではなくvalidateValue:forKey:error:を直接呼び出す必要があります。

は、例えば:

if ([[self model] validateValue:&text forKey:@"name" error:&validationError]){ 
    [[self model] setValue:text forKey:@"name"]; 
} else { 
    [self didFailWithError:validationError]; 
} 

これは、アクセッサメソッド内から実行されないべきです。アクションメソッドはこれを行うのに最適な場所です。

実際の使用例を見ることができますhere

関連する問題