可可网点表现怪异,无法识别选择器



我遇到了一些奇怪的行为,我在界面生成器中设置了一个标签,然后将标签作为引用出口连接到一个文件。

@property (weak) IBOutlet NSTextField *TitleLabel;

当我访问文件(单元格。TitleLabel.stringValue = title)并运行应用程序,它无法识别它。我明白这个:

-[NSApplication TitleLabel]: unrecognized selector sent to instance 0x608000101680

奇怪的是,它并不总是这样做,有时它可以正常工作并正确显示,有时则不会。

我刚刚开始搞砸IB,所以我可能错过了一些东西。有什么帮助吗?

该属性真的在您的NSApplication子类上吗? 还是在您的应用程序委托类上?它出现在应用程序对象上并非不可能,但这将是一个非常罕见(可以说是不明智的)模式。

简而言之,我怀疑您可能将其连接到错误的对象。

编辑:啊。明白了。您正在尝试通过 topLevelObjects 数组访问事物,但实际上,您不能指望topLevelObjects的顺序。你需要依靠owner的网点被填充,但你正在传递nil ownertopLevelObjects的存在只是为了给调用者提供 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];

这可能不是传统的方法,但它有效。如果有更好的技术或更常见的方法,请启发我!:)

最新更新