这是我生成数据的代码
- (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 但它没有显示数组中的任何数据..这里有什么问题吗? 谢谢!
答案 0 :(得分:1)
您尚未创建数组。
init
方法(包括NSMutableArray的initWithCapacity:
)初始化现有(新创建的)实例。您尚未创建一个,因此您将initWithCapacity:
消息发送给nil
,这意味着它无效。
您需要创建数组,然后对其进行初始化,然后将其分配给array
变量,最好是在同一行中。
还有一个问题是,在收到applicationDidFinishLaunching:
消息时,您的表视图已经要求提供数组。你还没有,所以什么都没有;当你创建一个时,它已经问过你并得到它的答案,并且不知道它应该再问一次。
在init
或initWithCoder:
中创建您的数组(我相信如果你的app委托是在nib中,你将需要后者),并实现并使用Key-Value-Coding-compatible accessor methods来填充数组值。当您发送自己的访问者消息时,您将导致KVO通知,这将通知表单视图,它需要再次请求数组。直接分配给实例变量不会导致此效果。
其他一些事情......
您有两种不同方法的[path stringByAppendingFormat:@"/%d.log", i]
个表达式。不要重复自己。将其移动到名为logFileNameWithLogFileNumber:
之类的方法,并向您自己发送该消息以生成文件名。这将使代码更清晰,更易于维护。
最后,作为一种风格问题,您不应使用stringByAppendingFormat:
或stringWithFormat:
来构建路径。使用stringByAppendingPathComponent:
(在这种情况下,与stringWithFormat:
一起生成文件名)。清晰度和路径名 - 分隔符独立性是美德。