Эта проблема может быть связана с Переменная экземпляра, не сохраняющая значение в приложении iOS .
У моего приложения есть табличное представление, которое должно быть заполнено данными из plist.Вопрос определяется на основе настроек по умолчанию.
После задания содержимого переменной экземпляра, подсчет на нем показывает, что он содержит несколько записей.Тем не менее, если позже я попытаюсь сосчитать эту переменную экземпляра при рисовании ячеек табличного представления, она не покажет записей.
-
Я объявил переменную экземпляра NSDictionary "providerData" в моем классеheader:
#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 читается правильно и что правильное значение providerPreference передается loadProviderDataSource.
Реализация 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;
}
В источнике loadProviderData я пытался использовать:
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
Есть идеи?