2

一意である必要があるテキストフィールドがあるため、カスタムを追加しましたNSFormatter(以下を参照)

スクリーンショットでわかるように、フォーマッタは機能しますが、私が使用している連続バインディングが壊れているため、たとえば、バインドされたテキストがリアルタイムで更新されなくなりました。

ここで考えられる原因を見つけましたが、この問題を回避して継続バインディングを再度有効にする方法がわかりません。

...

  • 12.ビューに NSFormatter が関連付けられている場合、値は NSFormatter インスタンスによってフォーマットされます。手順 17 に進みます。
  • ...
  • 17.更新された値がユーザー インターフェイスに表示されます。

そのため、必要な手順を意図的にスキップしているように見えます。これは非常に迷惑です。NSValueTransformer を試しましたが、それを編集可能な NSTextField に追加すると、編集できなくなります。

私のフォーマッター

- (BOOL)getObjectValue:(out id *)obj forString:(NSString *)string errorDescription:(out NSString **)error {

    if([string isNotEqualTo:@"todo-invalid-value"]){
        *obj = string;
        NSLog(@"YES");
        return YES;
    } else {
        if(error){
            *error = @"ERROR: not allowed";
        }
        return NO;
    }
}

- (NSString *)stringForObjectValue:(id)obj {
    return (NSString *)obj;
}

動作確認

ここに画像の説明を入力

リスト アイテムのタイトルは、テキスト フィールドに入力したテキストで更新される必要があることに注意してください。

4

1 に答える 1

4

私は週末に同じ問題に遭遇し、最終的に cocoa-dev メーリング リストでYann Disser による 2008 年の投稿を発見し、私の問題に光を当てました。

正常に動作していた既存NSFormatterのコンポーネントがあり、コンポーネントを分解したので、今朝もう少し時間をかけてヤンの投稿を見つけました。

重要なのは、渡されたオブジェクトとは異なるオブジェクトを返す必要があることです。微妙ですが、ドキュメントには次のように書かれています。変換が成功した場合、返されると、 string から作成されたオブジェクトが含まれます。

私が抱えていた問題は、NSString入ってきた が実際には でNSMutableStringあり、後で変更されていたという事実から生じました。

を返すように変更されたコードを次に示し[NSString stringWithString: string]ます。これにより、問題が解決するはずです。

- (BOOL)getObjectValue:(out id *)obj forString:(NSString *)string errorDescription:(out NSString **)error {

    if([string isNotEqualTo:@"todo-invalid-value"]){
        *obj = [NSString stringWithString: string];
        NSLog(@"YES");
        return YES;
    } else {
        if(error){
            *error = @"ERROR: not allowed";
        }
        return NO;
    }
}
于 2014-04-21T11:38:23.187 に答える