3

NSSearchFieldユーザーが矢印キーなどを押したかどうかを知りたい単純なアプリケーションがあります。アプリケーションでIBOutletsの値を変更したいのですが、サブクラスではそれを行うことができないため、サブクラス化したくありません。

編集

サブクラスでkeyUp:オーバーライドするメソッドは次のとおりです。NSSearchField

-(void)keyUp:(NSEvent*)event
{
    if ([event keyCode]==36){
    customers* c= [[customers alloc] init];//customers is the class where i have my IBOulets and my methods
    [[self window] selectKeyViewFollowingView:self];// change the first responder
    [c searcht:[self stringValue]];//here i want to call a method to make a query and change the stringValues of some IBOulets
    }
}
4

3 に答える 3

11

コントローラを検索フィールドのデリゲートとして割り当て、メソッドを実装します。

- (BOOL)control:(NSControl *)control textView:(NSTextView *)textView doCommandBySelector:(SEL)command

これで、矢印キーに対応するmoveDown:、moveUp:、moveLeft:、moveRight:などの単純なNSResponderセレクターを受信できるようになります。

于 2011-04-30T09:35:57.327 に答える
2

NSSearchFieldは、探しているデリゲートメソッドを持つNSControlを継承します。

- (void)controlTextDidChange:(NSNotification *)aNotification

NSSearchFieldをデリゲートとして設定し、このメソッドを実装します。編集を開始したのがNSSearchFieldであることを確認するためにチェックを実行することをお勧めします。たぶん、FirstResponderを使用できます。何かのようなもの:

- (void)controlTextDidChange:(NSNotification *)aNotification {
    If (mySearchField.isFirstResponder) {
        //throwdown
    }
}

http://developer.apple.com/library/mac/#documentation/cocoa/reference/ApplicationKit/Classes/NSControl_Class/Reference/Reference.html#//apple_ref/occ/cl/NSControl

于 2011-04-29T15:10:48.557 に答える
1

NSEventコードを持っていないビューに既に渡された s を取得する方法はありません。ビューまたはコントロールのキー処理動作を変更する場合は、サブクラス化する必要があります。レスポンダーチェーンの検索フィールドの前に別のオブジェクトを挿入し、イベントを取得し、好きなことをしてから、それを処理しなかったかのように振る舞い、フィールドに渡すことができるかもしれません...ただのワイルドな考えです頭の上から。

keyUp:あなたのコードに返信してUPDATE :

さて、問題は明らかになりつつあります。コードでその新しいcustomer* オブジェクトを作成するときは、その接続もコードでフックする必要があります。彼らはあなたのために接続されていません。これには実際には使用しませんIBOutlets。通常の古い ivar だけです。IBOutletsInterface Builder のグラフィカル インターフェイスでオブジェクトを接続できるようにするためだけに存在します。で何をしようとしているのか正確にはわかりませんがsearcht:、例として、テキスト フィールドの内容を変更したい場合:

- (void)searcht:(NSString *)theString {

    // Do some stuff with the string

    [myTextField setStringValue:someResultString];

}

customer.h は次のようになります。

@interface customer : NSObject {
    IBOutlet NSTextField * myTextField;
}

myTextFieldis であるため、これは警告を出さないことを含め、何もしませんnilnil一日中メソッドを呼び出すことができ、何も起こりません。必要なことは、customerオブジェクトにテキスト フィールドへのポインターを与えることです。これは であってはなりませんIBOutlet。メソッドでこれを行うか、単に直接設定することによって行うことができますinit...(これは、検索フィールドを に渡すためにテキスト フィールドへの接続が必要になることに注意してください。これは、Customer望ましい場合とそうでない場合があります)。 :

@interface Customer : NSObject {
    NSTextField * myTextField;
}

@property NSTextField * myTextField;    // Note: does not need to be retained.
@end

#import "Customer.h"

@implementation Customer

@synthesize myTextField;

- (id)initUsingTextField:(NSTextField *)tf {

    if( !(self = [super init]) ) {
        return nil;
    }

    myTextField = tf;

    return self;
}

@end

※余談ですが、Obj-Cのクラス名は大文字で始まるのが慣例で、「customer」ではなく「Customer」です。

于 2011-04-29T19:54:26.190 に答える