我遇到了一些奇怪的行为,我在界面生成器中设置了一个标签,然后将标签作为引用出口连接到一个文件。
@property (weak) IBOutlet NSTextField *TitleLabel;
当我访问文件(单元格。TitleLabel.stringValue = title)并运行应用程序,它无法识别它。我明白这个:
-[NSApplication TitleLabel]: unrecognized selector sent to instance 0x608000101680
奇怪的是,它并不总是这样做,有时它可以正常工作并正确显示,有时则不会。
我刚刚开始搞砸IB,所以我可能错过了一些东西。有什么帮助吗?
该属性真的在您的NSApplication
子类上吗? 还是在您的应用程序委托类上?它出现在应用程序对象上并非不可能,但这将是一个非常罕见(可以说是不明智的)模式。
简而言之,我怀疑您可能将其连接到错误的对象。
编辑:啊。明白了。您正在尝试通过 topLevelObjects
数组访问事物,但实际上,您不能指望topLevelObjects
的顺序。你需要依靠owner
的网点被填充,但你正在传递nil
owner
。 topLevelObjects
的存在只是为了给调用者提供 XIB 中顶级对象的"所有权"(在引用计数意义上)以进行内存管理,但它实际上并不像您在这里所做的那样直接"使用"。(公平地说,我可以想象您可能需要内省该数组的情况,但这很难上升到那个水平。
执行此操作的规范方法是使用 NSViewController
子类作为所有者。 在 Xcode 中,如果你在项目中添加一个 NSViewController
的子类,它会让你选择同时创建一个 xib 文件,该文件将连接所有内容。然后,您只需在运行时初始化NSViewController
子类,该类的 view
出口属性将填充根视图。您显然可以添加更多插座并插入您喜欢的任何内容。
这篇文章似乎涵盖了基础知识,如果你正在寻找更多详细信息。苹果关于xib文件的文档以及它们是如何工作的在这里。
问题是视图有时会被分配给 NSApplication。我不确定我启动视图的方式是否是执行此操作的常见方式,但问题出在此代码块中:
NSArray * views;
[[NSBundle mainBundle] loadNibNamed:@"CollapseClickViewController" owner:nil topLevelObjects:&views];
CollapseClickCell * cell = [[CollapseClickCell alloc] initWithFrame:CGRectMake(0,0,320,50)];
cell = [views objectAtIndex:0];
问题是[views objectAtIndex:0]
有时会返回NSApplication
.为了修复它,我只是对照自身检查了该类并通过以下方式返回该对象:
-(CollapseClickCell*)assignCell:(CollapseClickCell*)cell withArray:(NSArray*)array{
for ( int i = 0; i< [array count]; i++) {
if ([[array objectAtIndex:i] class] == [CollapseClickCell class]) {
return [array objectAtIndex:i];
}
}
return nil;
}
然后,我将其分配给对象: cell = [cell assignCell:cell withArray:views];
这可能不是传统的方法,但它有效。如果有更好的技术或更常见的方法,请启发我!:)