2

因此,我正在尝试制作一个具有按钮(不一定是按钮)的应用程序,当您将鼠标悬停在它上面时,会出现一个弹出窗口。当我将鼠标悬停在按钮上时,我已经能够在日志中打印一条消息,但我不知道如何将图像的 Hidden 属性设置为 NO。我尝试给 NSButtonCell (接收悬停事件的类)一个委托,但调用

[myButtonCell setDelegate:delegateObject]

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

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

我觉得我到处寻找,但找不到解决方案。我以为我会使用委托,但我无法为 buttonCell 设置委托,所以我被卡住了……</p>

编辑:

下面是 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

我的按钮单元:

@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]

第三种可能性是按照您的建议进行操作,并为您的 NSButtonCell 提供一个可以直接向其发送消息的对象,但这与在 controlView 或 controlView 的窗口上使用 performSelectorOnMainThread 相同,但需要更多工作。

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

于 2013-03-02T12:35:42.770 回答