iOS - 使用故事板时视图控制器的自定义初始化方法

时间:2014-03-30 03:06:10

标签: ios objective-c

我已经阅读了几篇与此类似的帖子,但我发现它们太具体了。我真正想要的是一个更一般的答案。根据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处的对象。我错过了什么吗?

1 个答案:

答案 0 :(得分:0)

如果您只在视图出现后需要使用数据,那么

viewDidLoad是最佳位置,这通常是视图控制器的情况,因为它们仅用于管理视图。

这是最好的地方,因为它无论如何被初始化都会被调用。

如果您确实希望早些时候准备好数据,则可以实现+initialize+load方法(NSObject +load and +initialize - What do they do?),但这不是您应该在View中执行的操作控制器。