2

そのため、ボタンにカーソルを合わせるとポップアップウィンドウが表示されるボタン(ボタンである必要はありません)を備えたアプリケーションを作成しようとしています。ボタンにカーソルを合わせるとログにメッセージを出力できましたが、画像のHiddenプロパティをNOに設定する方法がわかりません。NSButtonCell(ホバーイベントを受信するクラス)にデリゲートを与えてみましたが、

[myButtonCell setDelegate:delegateObject]

オブジェクトにデリゲートを与えません。buttonCellと画像が通信する方法(両方とも同じxibにある)を見つけるか、buttonCellに、インスタンスとしてそれを持っているクラスの1つで関数を呼び出す方法を見つけることができれば、簡単に理解できます。残り。

私の説明は少し拡散しているので、もっとよく説明しようと思います。NSButtonCellオブジェクト(IBOutlet)のサブクラスを持つビューオブジェクトを持つウィンドウオブジェクトがあります。NSButtonCellのサブクラス(MyButtonCellと呼びます)には、呼び出し時にビューまたはウィンドウにメソッドが呼び出されたことを通知する必要があるメソッドがあります。

どこを見てもいい気がしますが、解決策が見つかりません。デリゲートで作成しようと思っていましたが、buttonCellのデリゲートを設定できないため、行き詰まりました…</ p>

編集:

NSButtonCellとデリゲートのコードは次のとおりです。デリゲート:

@interface MyView : NSView <MyButtonCellDelegate>
    {

    }
@property (assign) IBOutlet MyButtonCell *buttonCell1;
    - (void)toggleField:(int)fieldID;
@end

@implementation MyView

- (void)toggleField:(int)fieldID
{
    if (fieldID == 1) {
        [self.field1 setHidden:!buttonCell1.active];
    }
    NSLog(@"toggling");
}
@end

MyButtonCell:

@protocol MyButtonCellDelegate

- (void)toggleField:(int)fieldID;

@end

@interface MyButtonCell : NSButtonCell
{
    id <MyButtonCellDelegate> delegate;
}

@property BOOL active; //Used to lett the view know wether the mouse hovers over it
@property (nonatomic, assign) id  <DuErButtonCellDelegate> delegate;

-(void)_updateMouseTracking; //mouse tracking function, if you know a better way to do it that would be lovely

@end

@implementation MyButtonCell

@synthesize delegate;
@synthesize active;

- (void)mouseEntered:(NSEvent *)event
{
    active = YES;
    [[self delegate] toggleField:1];
    NSLog(@"entered");
}

- (void)mouseExited:(NSEvent *)event
{
    active = NO;
    [[self delegate] toggleField:1];
}

- (void)_updateMouseTracking {
    [super _updateMouseTracking];
    if ([self controlView] != nil && [[self controlView] respondsToSelector:@selector(_setMouseTrackingForCell:)]) {
        [[self controlView] performSelector:@selector(_setMouseTrackingForCell:) withObject:self];
    }


}

@end

これが十分に明確であることを願っています

4

1 に答える 1

2

あなたが本当に何を探しているのかわかりませんが、あなたがここで何を求めているのか理解できれば:

NSButtonCellオブジェクト(IBOutlet)のサブクラスを持つビューオブジェクトを持つウィンドウオブジェクトがあります。NSButtonCellのサブクラス(MyButtonCellと呼びます)には、呼び出し時にビューまたはウィンドウにメソッドが呼び出されたことを通知する必要があるメソッドがあります。

正しくは、NSButtonCellがNSNotificationをデフォルトの通知センターに投稿し、ビューやウィンドウ、またはその通知のオブザーバーになる必要がある人を配置する可能性があります。独自のカスタム通知を自由に定義できます。

別の可能性は、NSButtonCellのサブクラスが使用することです。

- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait

また、NSCellメソッドから、呼び出されたときにビューまたはウィンドウに通知する必要がある場合は、次のことができます。

[[self controlView] performSelectorOnMainThread:@selector( viewMethodToInvoke: ) withObject:anObject waitUntilDone:YES]

また

[[[self controlView] window] performSelectorOnMainThread:@selector( windowMethodToInvoke: ) withObject:anObject waitUntilDone:YES]

3番目の可能性は、提案どおりに実行し、NSButtonCellにメッセージを直接送信できるオブジェクトを提供することですが、これはcontrolViewまたはcontrolViewのウィンドウでperformSelectorOnMainThreadを使用するのと同じですが、より多くの作業が必要です。

マウストラッキングコードについては、NSTrackingAreaを使用していると思います。それらに関するドキュメントはここにあります:トラッキングエリアオブジェクトの使用

于 2013-03-02T12:35:42.770 に答える