此问题可能与Instance variable not retaining 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
有什么想法吗?
答案 0 :(得分:3)
基于NSLog(@"%@", self);
的方法,显示如下
<强> loadProviderDataSource 强>
self: <ViewController: 0x83739b0>
<强>的tableView:的cellForRowAtIndexPath 强>
self: <ViewController: 0x8373170>
看起来你正在以某种方式创建ViewController
的第二个实例。
我知道其中一个是使用XIB创建的。验证您是否以编程方式创建另一个。