因此,我正在尝试制作一个具有按钮(不一定是按钮)的应用程序,当您将鼠标悬停在它上面时,会出现一个弹出窗口。当我将鼠标悬停在按钮上时,我已经能够在日志中打印一条消息,但我不知道如何将图像的 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
希望这足够清楚