为什么tableview不显示绑定数据?

时间:2010-06-30 21:01:23

标签: objective-c cocoa binding

这是我生成数据的代码

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    // Insert code here to initialize your application 
    [array initWithCapacity:20];
}

- (IBAction) readlog:(id)sender {
    for (int i = 0; i < 20; i++) {      
        NSDictionary *d = [NSDictionary dictionaryWithContentsOfFile:[path stringByAppendingFormat:@"/%d.log",i]];
        [array addObject:d];
    }

}

- (IBAction) writelog:(id)sender {
    for (int i = 0; i < 20; i++) {
        NSMutableDictionary *d = [NSMutableDictionary dictionary];
        NSString *name = [NSString stringWithFormat:@"testfile%d", i];
        [d setObject:[NSDate date] forKey:@"date"];
        [d setObject:[path stringByAppendingFormat:@"/%d.log", i] forKey:@"path"];
        [d setObject:name forKey:@"name"];
        [d writeToFile:[path stringByAppendingFormat:@"/%d.log", i] atomically:YES];
    }

我用appdelegate.array将我的tableview列绑定到keypath name / path / date 但它没有显示数组中的任何数据..这里有什么问题吗? 谢谢!

1 个答案:

答案 0 :(得分:1)

您尚未创建数组。

init方法(包括NSMutableArray的initWithCapacity:)初始化现有(新创建的)实例。您尚未创建一个,因此您将initWithCapacity:消息发送给nil,这意味着它无效。

您需要创建数组,然后对其进行初始化,然后将其分配给array变量,最好是在同一行中。

还有一个问题是,在收到applicationDidFinishLaunching:消息时,您的表视图已经要求提供数组。你还没有,所以什么都没有;当你创建一个时,它已经问过你并得到它的答案,并且不知道它应该再问一次。

initinitWithCoder:中创建您的数组(我相信如果你的app委托是在nib中,你将需要后者),并实现并使用Key-Value-Coding-compatible accessor methods来填充数组值。当您发送自己的访问者消息时,您将导致KVO通知,这将通知表单视图,它需要再次请求数组。直接分配给实例变量不会导致此效果。

其他一些事情......

您有两种不同方法的[path stringByAppendingFormat:@"/%d.log", i]个表达式。不要重复自己。将其移动到名为logFileNameWithLogFileNumber:之类的方法,并向您自己发送该消息以生成文件名。这将使代码更清晰,更易于维护。

最后,作为一种风格问题,您不应使用stringByAppendingFormat:stringWithFormat:来构建路径。使用stringByAppendingPathComponent:(在这种情况下,与stringWithFormat:一起生成文件名)。清晰度和路径名 - 分隔符独立性是美德。