7

我正在尝试设置一个NSCollectionView(我过去已经成功地做到了这一点,但由于某种原因这次失败了)。

我有一个名为“TestModel”的模型类,它有一个NSString只返回一个字符串的属性(现在仅用于测试目的)。然后我在我的主应用程序委托类中有一个NSMutableArray属性声明,并向这个数组添加TestModel对象的实例。

然后我有一个数组控制器,它的内容数组绑定了应用程序委托的NSMutableArray. 我可以确认到目前为止一切正常;NSLogging:

[[[arrayController arrangedObjects] objectAtIndex:0] teststring]

工作正常。

然后,我为集合视图设置(itemPrototype 和内容)以及集合视图项(视图)设置了所有适当的绑定。然后,我在绑定到 Collection View 的集合项视图中有一个文本字段Item.representedObject.teststring。但是,当我启动应用程序时,集合视图中没有显示任何内容,只是一个空白的白色屏幕。我错过了什么?

更新:这是我使用的代码(由 wil Shipley 要求):

// App delegate class

@interface AppController : NSObject {

NSMutableArray *objectArray;
}
@property (readwrite, retain) NSMutableArray *objectArray;
@end

@implementation AppController
@synthesize objectArray;

- (id)init
{
    if (self = [super init]) {
    objectArray = [[NSMutableArray alloc] init];
    }
    return self;
}


- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    TestModel *test = [[[TestModel alloc] initWithString:@"somerandomstring"] autorelease];
    if (test) [objectArray addObject:test];
}
@end

// The model class (TestModel)

@interface TestModel : NSObject {
NSString *teststring;
}
@property (readwrite, retain) NSString *teststring;
- (id)initWithString:(NSString*)customString;
@end

@implementation TestModel
@synthesize teststring;

- (id)initWithString:(NSString*)customString
{
    [self setTeststring:customString];
}

- (void)dealloc
{
    [teststring release];
}
@end

然后就像我说的,Array Controller 的 content 数组绑定到这个“objectArray”,NSCollectionView 的 Content 绑定到 Array Controller.arrangedObjects。我可以通过 NSLogging [arrayController mappedObjects] 验证 Array Controller 中是否包含对象,并且它返回正确的对象。只是在 NSCollectionView 中没有显示任何内容。

更新 2:如果我记录 [collectionView 内容],我什么也得不到:

2009-10-21 08:02:42.385 CollViewTest[743:a0f] (
)

问题可能就在那里。

更新 3:这里要求的是 Xcode 项目:

http://www.mediafire.com/?mjgdzgjjfzw

它是一个菜单栏应用程序,所以它没有窗口。当您构建并运行应用程序时,您会看到一个显示“测试”的菜单栏项,这将打开包含 NSCollectionView 的视图。

谢谢

4

1 回答 1

4

问题是您没有正确使用 KVC。你可以做两件事。

方法一:简单但不那么优雅

  1. 使用以下代码将对象添加到数组中

[[self mutableArrayValueForKey:@"objectArray"] addObject:test];

这并不优雅,因为您必须使用字符串值指定变量,因此当拼写错误时您不会收到编译器警告。

方法2:生成数组“objectArray”所需的KVO方法。

  1. 在接口声明中选择属性
  2. 选择 Scripts(菜单栏中的脚本图标)> Code > Place accessor decls on Clipboard
  3. 将声明粘贴到接口文件的适当位置
  4. 选择 Scripts > Code > Place accessor defs on Clipboard
  5. 将定义粘贴到实现文件的适当位置

然后,您可以使用看起来像的方法

[self insertObject:test inObjectArrayAtIndex:0];
于 2009-11-03T06:34:46.083 回答