mouseDown未在NSTextField上正常触发

时间:2013-01-03 02:27:56

标签: objective-c mouseevent

我尝试实施这篇文章中发布的第二个答案 here.我有这个问题的人,但我的mouseDown没有工作/注册。这就是我所拥有的。

  1. AppDelegate.h
  2. AppDelegate.m
  3. MouseDownTextField.h
  4. MouseDownTextField.m
  5. 并且存在相关内容:

    1. 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
      
    2. 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");}
      
    3. 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
      
    4. 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
      
    5. 关于可能出错或做错的想法?​​

1 个答案:

答案 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。希望这会有所帮助。