Ленивый инициализатор никогда не вызывается при загрузке данных списков в UITableView - PullRequest
1 голос
/ 27 декабря 2011

Я пытаюсь загрузить простой файл plist (с массивом в корне) в UITableView (в первом представлении приложения с вкладками XCode 4.2).Я делал это раньше в других (XCode 3) проектах, но по некоторым причинам кажется, что мой ленивый инициализатор для массива никогда не вызывается.

.h файл:

#import <UIKit/UIKit.h>

@interface NailPolishFirstViewController : UIViewController { 
    NSMutableArray *myCollection;
} 

@property(nonatomic, retain) NSMutableArray *myCollection;

@end

.m файл (соответствующие части)

#import "NailPolishFirstViewController.h"

@implementation NailPolishFirstViewController

@synthesize myCollection;

// ... 

- (NSMutableArray *) myCollection {
    if (myCollection == nil) {
        NSString *path = [[NSBundle mainBundle] bundlePath];
        NSString *finalPath = [path stringByAppendingPathComponent:@"database.plist"];
        self.myCollection = [NSMutableArray arrayWithContentsOfFile:finalPath];
        NSLog(@"Collection size: %@", [self.myCollection count]);
    }
    return myCollection;
}

// ... 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    NSLog(@"Getting rows ... %@", [myCollection count]);
    return [myCollection count];
}

// ...

К файлу xib для этого контроллера прикреплен UITableView, а также dataSource и делегатустановлены на владельца файла.

Когда я собираю и запускаю, numberOfRowsInSection записывает в журнал «Получение строк ... (ноль)», но журнал в моем ленивом инициализаторе для myCollection никогда не отображается.Почему это никогда не вызывается?

Ответы [ 2 ]

0 голосов
/ 27 декабря 2011

Поскольку myCollection является объявленным свойством, оно должно ссылаться на свой метод доступа.Попробуйте назвать его как self.myCollection.

Например,

- (NSMutableArray *) myCollection {
    if (myCollection == nil) {
        NSString *path = [[NSBundle mainBundle] bundlePath];
        NSString *finalPath = [path stringByAppendingPathComponent:@"database.plist"];
        myCollection = [NSMutableArray arrayWithContentsOfFile:finalPath];
        NSLog(@"Collection size: %@", [self.myCollection count]);
    }
    return myCollection;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    NSLog(@"Getting rows ... %@", [self.myCollection count]);
    return [self.myCollection count];
}
0 голосов
/ 27 декабря 2011

Вы не проходите через аксессор.Использование [myCollection count] - это прямой доступ к ивару, который будет равен нулю.Если вы собираетесь использовать отложенную загрузку, вы всегда должны использовать self.myCollection, иначе он никогда не вызовет ваш метод доступа и никогда не заполнит записи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...