因此,我试图制作一个具有按钮(不必是按钮)的应用程序,当您将鼠标悬停在该按钮上时,会弹出一个窗口。当我将鼠标悬停在按钮上时,我已经能够在日志中打印一条消息,但是我不知道如何将图像的“隐藏”属性设置为“否”。我尝试给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

08-05 22:35