此问题可能与Instance variable not reserved value in iOS application有关。
我的应用程序有一个表格视图,它应该填充来自 plist 的数据。plist 问题是根据默认设置确定的。
设置实例变量的内容后,对其进行计数表明它包含多条记录。但是,如果我稍后在绘制表格视图单元格时尝试计算此实例变量,则它不会显示任何记录。
--
我在类头中声明了一个“providerData”NSDictionary 实例变量:
#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;
}
在 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
有任何想法吗?