我有一个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];
答案 0 :(得分:2)
这里有很多问题需要回答。如错误消息所示,问题是setLineBreakMode:
选择器被发送到无法识别该选择器的对象。可能会发生什么导致这种情况?弄清楚这样的事情需要批判性思考和侦探工作。以下是一些想法。
-setLineBreakMode:
似乎实际上并未由NSTextField
实施;据我所知,它是NSCell
和NSMutableParagraphStyle
的方法。如果您有NSTextField
(或其子类),则通常会调用[[myTextField cell] setLineBreakMode:...]
,但您的代码段并不表示您正在执行此操作。因此,除非你在你的子类中实现了这个方法 - 你没有声明你做了 - 这可能是崩溃的原因。也许你没有在Mac上看到崩溃,因为无论出于何种原因,这段代码路径都没有被击中?或许苹果私下在优胜美地实施这种方法,但不是在小牛队?谁知道。你是否从该行的编译器收到警告,说该对象没有响应该选择器?不要忽略编译器警告。
您发布的代码看起来就像是在类对象上调用setLineBreakMode:
而不是在类的实例上调用NSTextFieldSubClass
。通常类以大写字母开头,而实例以小写字母开头。像这样遵守编码惯例会让每个人都感到困惑。如果你的子类真的名为NS
,那么我同意@MichaelDautermann你永远不应该用NS
前缀来命名类;这既困惑又惹麻烦,因为对于你所知道的所有人,Apple都有一个私有子类,正是这个名字。以NSTextFieldSubClass
开头的类名由Apple保留。
您可能认为在您显然命名为NSZombieEnabled
的变量中的对象根本不是您的子类的实例,或者已被释放(并且可能被新对象替换)在同一地址)或某些此类问题,这就是它不响应选择器的原因。您可以通过启用NSLog
,在调试器中检查它,添加-description
它(可能在您的子类中添加unzip myDoc.docx
方法)或许多其他技术来进行调查。< / p>
这一切都很模糊,但问题很模糊。您需要发布子类的代码,实例化子类的代码,以及至少崩溃的行周围的代码,以获得更具体的帮助。我们无法理解你的想法,而这个错误的根源可能就在其中一个地方。