所以我试图创建一个带有按钮的应用程序(不一定是按钮),当你将鼠标悬停在按钮上时会出现一个弹出窗口。当我将鼠标悬停在按钮上时,我能够将消息打印到日志中,但我无法弄清楚如何将图像的隐藏属性设置为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
希望这很清楚
答案 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