在NSButton上获取悬停事件以显示图像

时间:2013-02-28 18:00:16

标签: objective-c macos cocoa hover nsbuttoncell

所以我试图创建一个带有按钮的应用程序(不一定是按钮),当你将鼠标悬停在按钮上时会出现一个弹出窗口。当我将鼠标悬停在按钮上时,我能够将消息打印到日志中,但我无法弄清楚如何将图像的隐藏属性设置为NO。我尝试给NSButtonCell(接收悬停事件的类)一个委托,但是调用

[myButtonCell setDelegate:delegateObject]

不为对象提供委托。如果我能找到一种方法让buttonCell和图像进行通信(它们都在同一个xib中)或者让buttonCell调用其中一个类中的函数作为一个实例,那么找出它是一件容易的事。其余的。

我的解释有点分散,所以我将尝试更好地解释:我有一个带有视图对象的窗口对象,它有一个NSButtonCell对象的子类(IBOutlet)。在NSButtonCell的子类中(让我们称之为MyButtonCell)我有一个方法,当调用需要通知视图或窗口时,方法已被调用。

我觉得我到处都是,但找不到解决方案。我以为我会用委托制作它,但我不能为buttonCell设置委托,所以我被卡住了......

修改

以下是NSButtonCell和Delegate的代码: 代表:

@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

希望这很清楚

1 个答案:

答案 0 :(得分:1)

我不确定你在寻找什么,但如果我明白你在这里问的是什么:

  

我有一个带有视图对象的窗口对象,它有一个子类a   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]

第三种可能性是按照你的建议去做,并为你的NSButtonCell提供一个可以直接发送消息的对象,但这与在controlView或controlView的窗口上使用performSelectorOnMainThread是一回事,但更多的工作。

至于鼠标跟踪代码,我假设你使用的是NSTrackingArea。您可以在此处找到有关它们的文档:Using Tracking-Area Objects