NSTextField子类在setLineBreakMode:方法上崩溃

时间:2015-10-01 08:19:09

标签: objective-c macos cocoa crash nstextfield

我有一个NSTextField的子类,我设置了LineBreakMode。

在Yosemite的Mac下工作正常 和我在小牛队的一个用户崩溃

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[XTextField setLineBreakMode:]: unrecognized selector sent to instance 0x7fc784548ad0'

我怎么能在这轮工作?

子类的头文件

#import <Cocoa/Cocoa.h>

@interface XTextField : NSTextField

- (void)setText:(NSString *)text

@end

实施

#import "XTextField.h"
@implementation XTextField

- (void)setText:(NSString *)text
{
    if (text)
    {
        [self setStringValue:text];
    }
    else
    {
        [self setStringValue:@""];
    }
 }


 - (instancetype)initWithFrame:(NSrect)frame
 {
     if(self = [super initWithFrame:frame])
     {
         [self setEditable:NO];
         [self setSelectable:NO];
         [self setDrawsBackGround:NO];
         [self setBezeled:NO];
     }
     return self;
 }
 @end

致电代码:

XTextField* myLabel = [[XTextField alloc]initWithFrame:myFrame];
[myLabel settext:@"text text text"];
[myLabel setLineBreakMode:NSLineBreakByTruncatingTail];

1 个答案:

答案 0 :(得分:2)

这里有很多问题需要回答。如错误消息所示,问题是setLineBreakMode:选择器被发送到无法识别该选择器的对象。可能会发生什么导致这种情况?弄清楚这样的事情需要批判性思考和侦探工作。以下是一些想法。

  1. -setLineBreakMode:似乎实际上并未由NSTextField实施;据我所知,它是NSCellNSMutableParagraphStyle的方法。如果您有NSTextField(或其子类),则通常会调用[[myTextField cell] setLineBreakMode:...],但您的代码段并不表示您正在执行此操作。因此,除非你在你的子类中实现了这个方法 - 你没有声明你做了 - 这可能是崩溃的原因。也许你没有在Mac上看到崩溃,因为无论出于何种原因,这段代码路径都没有被击中?或许苹果私下在优胜美地实施这种方法,但不是在小牛队?谁知道。你是否从该行的编译器收到警告,说该对象没有响应该选择器?不要忽略编译器警告。

  2. 您发布的代码看起来就像是在类对象上调用setLineBreakMode:而不是在类的实例上调用NSTextFieldSubClass。通常类以大写字母开头,而实例以小写字母开头。像这样遵守编码惯例会让每个人都感到困惑。如果你的子类真的名为NS,那么我同意@MichaelDautermann你永远不应该用NS前缀来命名类;这既困惑又惹麻烦,因为对于你所知道的所有人,Apple都有一个私有子类,正是这个名字。以NSTextFieldSubClass开头的类名由Apple保留。

  3. 您可能认为在您显然命名为NSZombieEnabled的变量中的对象根本不是您的子类的实例,或者已被释放(并且可能被新对象替换)在同一地址)或某些此类问题,这就是它不响应选择器的原因。您可以通过启用NSLog,在调试器中检查它,添加-description它(可能在您的子类中添加unzip myDoc.docx 方法)或许多其他技术来进行调查。< / p>

  4. 这一切都很模糊,但问题很模糊。您需要发布子类的代码,实例化子类的代码,以及至少崩溃的行周围的代码,以获得更具体的帮助。我们无法理解你的想法,而这个错误的根源可能就在其中一个地方。