我尝试实施这篇文章中发布的第二个答案 here.我有这个问题的人,但我的mouseDown
没有工作/注册。这就是我所拥有的。
并且存在相关内容:
AppDelegate.h
#import <Cocoa/Cocoa.h>
#import "MouseDownTextField.h"
@interface AppDelegate : NSObject <MouseDownTextFieldDelegate> {
NSWindow *window;
IBOutlet NSMenu *statusMenu;
NSStatusItem *statusItem;
NSMutableArray *selector;
NSMutableArray *display;
NSTimer *timer;
MouseDownTextField *quoteHolder; }
@property IBOutlet MouseDownTextField *quoteHolder;
@end
AppDelegate.m
- (void)displayString:(NSString *)title {
NSRect frame = NSMakeRect(50, 0, 200, 17);
quoteHolder = [[MouseDownTextField alloc] initWithFrame:frame];
[[self quoteHolder] setDelegate:self];
[quoteHolder setStringValue:title];
[quoteHolder setTextColor:[NSColor blueColor]];
[test addSubview:quoteHolder];
[statusItem setView:test]; }
-(void)mouseDownTextFieldClicked:(MouseDownTextField *)textField {
NSLog(@"Clicked");}
MouseDownTextField.h
#import <Appkit/Appkit.h>
@class MouseDownTextField;
@protocol MouseDownTextFieldDelegate <NSTextFieldDelegate>
-(void) mouseDownTextFieldClicked:(MouseDownTextField *)textField;
@end
@interface MouseDownTextField: NSTextField {
}
@property(assign) id<MouseDownTextFieldDelegate> delegate;
@end
MouseDownTextField.m
#import "MouseDownTextField.h"
@implementation MouseDownTextField
-(void)mouseDown:(NSEvent *)event {
[self.delegate mouseDownTextFieldClicked:self]; }
-(void)setDelegate:(id<MouseDownTextFieldDelegate>)delegate {
[super setDelegate:delegate]; }
-(id)delegate {
return [super delegate]; }
@end
关于可能出错或做错的想法?
答案 0 :(得分:1)
您正在IB中创建quoteHolder,您应该删除以下代码行,您应该没问题。
quoteHolder = [[MouseDownTextField alloc] initWithFrame:frame];
重新分配NSTextField
的结果是您点击的那个不再是向代表注册的那个。无需将其添加为subview
,它已被添加到IB中的视图层次结构中。
另外,请确保在IB中,在“辅助功能”下,检查“{1}}已启用”已启用用户互动“。
关于后续问题,你怎么能有多个这些?
如果您在IB中添加了多个NSTextField
个实例,则每个实例都会被引用为@property,就像使用quoteHolder一样。链接在IB中完成,如linked answer。
这些都可以拥有相同的代表。当按下NSTextField
时,您可以查询mouseDownTextFieldClicked:
以获取可在IB中分配的唯一ID。希望这会有所帮助。