Эта проблема может быть связана с переменной экземпляра, не сохраняющей значение в приложении iOS < / а>.
В моем приложении есть табличное представление, которое должно быть заполнено данными из списка. Список вопросов определяется на основе настроек по умолчанию.
После установки содержимого переменной экземпляра подсчет показывает, что она содержит несколько записей. Однако, если позже я попытаюсь подсчитать эту переменную экземпляра при рисовании ячеек табличного представления, записей не будет.
--
Я объявил переменную экземпляра NSDictionary "providerData" в заголовке своего класса:
#import <UIKit/UIKit.h>
@interface ViewController : UITableViewController {
NSDictionary *providerData;
}
@property (nonatomic, retain) NSDictionary *providerData;
- (void)loadProviderDataSource:(NSString *)providerName;
@end
В моей реализации я использую viewDidLoad для чтения словаря из файла plist, проверяю значение «provider_preference» и затем вызываю [self loadProviderDataSource:providerPreference]
:
- (void)viewDidLoad
{
[super viewDidLoad];
// Retrieve the user's provider preference from defaults:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
// Set a default value for provider preference if the user didn't explicitly set one:
NSString *providerPreference = [[NSString alloc] initWithString:@"foo"];
if ([defaults stringForKey:@"provider_preference"]) {
providerPreference = [defaults stringForKey:@"provider_preference"];
}
// Load provider data from the relevant plist:
[self loadProviderDataSource:providerPreference];
}
Все это работает нормально (с помощью NSLog я вижу, что файл plist читается правильно и что в loadProviderDataSource передается правильное значение providerPreference.
Реализация loadProviderDataSource выглядит следующим образом:
- (void)loadProviderDataSource:(NSString *)providerName
{
// Set the filename and path for the data source:
NSString *dataSourceFileName = [[NSString alloc] initWithFormat:@"data-%@.plist",providerName];
NSString *dataSourcePath = [[NSBundle mainBundle] bundlePath];
dataSourcePath = [dataSourcePath stringByAppendingPathComponent:dataSourceFileName];
// Read the provider data:
self.providerData = [[NSDictionary alloc] initWithContentsOfFile:dataSourcePath];
NSLog(@"provider data entry count 1: %d", [self.providerData count]);
}
На этом этапе NSLog показывает мне, что в providerData есть 2 записи.
Однако, когда мне нужно установить ячейки для представления таблицы, NSLog в следующем коде показывает мне, что providerData имеет 0 записей:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}
NSLog(@"provider data entry count 2: %d", [self.providerData count]);
return cell;
}
В loadProviderDataSource я пробовал использовать:
self.providerData = [[NSDictionary alloc] initWithContentsOfFile:dataSourcePath];
и:
[self setProviderData:[[NSDictionary alloc] initWithContentsOfFile:dataSourcePath]];
... ни одна работа, и я все еще получаю это в моем журнале:
provider data entry count 1: 2
provider data entry count 2: 0
provider data entry count 2: 0
Любые идеи?
loadProviderDataSource
и как загружаетеViewController
экземпляр? - person Deepak Danduprolu   schedule 15.07.2011self.providerData = [[NSDictionary alloc] initWithContentsOfFile:dataSourcePath];
. Вам нужно добавить командуautorelease
. - person FreeAsInBeer   schedule 15.07.2011[self loadProviderDataSource:providerPreference];
Интерфейс MainWindow.xib моего приложения имеет контроллер навигации, внутри которого находится мой ViewController (который является подклассом класса UITableViewController). Контроллер навигации, в котором находится ViewController, является моим корневым контроллером представления, поэтому он загружается, как только это делает приложение. - person Willem   schedule 15.07.2011providerData
установлен в другом месте? Можете ли вы добавить методviewDiadLoad
? - person Deepak Danduprolu   schedule 15.07.2011tableView:cellForRowAtIndexPath:
. - person cduhn   schedule 15.07.2011tableView:cellForRowAtIndexPath
ноль, но я не понимаю почему. Единственное место, где я назначаю ему данные, - это loadProviderDataSource. Может быть, что-то не так с объявлением моей переменной экземпляра providerData, и она каким-то образом сохраняет свои данные только для локальной области в каждом методе? - person Willem   schedule 15.07.2011NSLog(@"%@", self);
в журналеloadProviderDataSource:
иtableView:cellForRowAtIndexPath:
? - person Deepak Danduprolu   schedule 15.07.2011loadProviderDataSource self: <ViewController: 0x83739b0>
иtableView:cellForRowAtIndexPath self: <ViewController: 0x8373170>
. - person Willem   schedule 15.07.2011