因此,我试图制作一个具有按钮(不必是按钮)的应用程序,当您将鼠标悬停在该按钮上时,会弹出一个窗口。当我将鼠标悬停在按钮上时,我已经能够在日志中打印一条消息,但是我不知道如何将图像的“隐藏”属性设置为“否”。我尝试给NSButtonCell(接收悬停事件的类)委托,但调用
[myButtonCell setDelegate:delegateObject]
不给对象委托。如果我可以找到一种方式让buttonCell和image进行通信(它们都在同一个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
希望这足够清楚
最佳答案
我不确定您真正想要的是什么,但是如果我了解您在这里的要求:
我有一个带有视图对象的窗口对象,该对象具有一个子类
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