我已经阅读了几篇与此类似的帖子,但我发现它们太具体了。我真正想要的是一个更一般的答案。根据Apple的视图控制器编程指南,viewDidLoad:
应该用于“分配或加载要在视图中显示的数据”。如果我有一些与显示无关的数据,我应该在哪里初始化它们?
有些帖子表明,当通过故事板初始化视图控制器时,可以在initWithCoder:
中完成初始化。我试图在initWithCoder:
中初始化一个数组,但之后发现数组仍然是空的。那么我们可以编写一个指定的初始化程序来初始化这种数据吗?
以下是代码:
- (id)initWithCoder:(NSCoder *)aDecoder
{
if (self = [super initWithCoder:aDecoder]) {
// load notes
NSString * path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
_notes = [[PWCNotes alloc] initNotesWithFilename:self.docTitle path:path numberOfPages:self.numberOfPages];
_index = 0;
}
return self;
}
以下是PWCNotes
- (id)initNotesWithFilename:(NSString *)fileName path:(NSString *)path numberOfPages:(int)numberOfPages
{
if (!(self = [super init])) {
return nil;
}
_filePath = [path stringByAppendingString:[NSString stringWithFormat:@"/%@/notes.txt", fileName]];
BOOL exists = [[NSFileManager defaultManager] fileExistsAtPath:self.filePath];
if (!exists)
{
// if file does not exist, create one and initialize the content
_notes = [[NSMutableArray alloc] init];
[[NSFileManager defaultManager] createFileAtPath:self.filePath contents:nil attributes:nil];
NSString * emptyString = @"Add Notes Here!";
for (int i = 0; i < numberOfPages; ++i)
{
[self.notes addObject:emptyString];
}
// write content of the array to the file
[self.notes writeToFile:self.filePath atomically:YES];
}
else
{
// otherwise, load it from the text file
_notes = [[NSMutableArray alloc] initWithContentsOfFile:self.filePath];
}
return self;
}
PWCNotes
类具有NSString *
s的可变数组作为属性。当我调用[self.notes.notes getObjectAtIndex:self.index]
时,会抛出NSRangeException
,说我正在尝试访问空数组中索引0处的对象。我错过了什么吗?
答案 0 :(得分:0)
viewDidLoad
是最佳位置,这通常是视图控制器的情况,因为它们仅用于管理视图。
这是最好的地方,因为它无论如何被初始化都会被调用。
如果您确实希望早些时候准备好数据,则可以实现+initialize
或+load
方法(NSObject +load and +initialize - What do they do?),但这不是您应该在View中执行的操作控制器。