0

此问题可能与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

有任何想法吗?

4

1 回答 1

3

基于NSLog(@"%@", self);这两种方法,如下所示

负载提供者数据源

self: <ViewController: 0x83739b0> 

表视图:cellForRowAtIndexPath

self: <ViewController: 0x8373170>

看起来您正在以ViewController某种方式创建第二个实例。

我知道其中之一是使用 XIB 创建的。验证您是否正在以编程方式创建另一个。

于 2011-07-15T10:23:48.423 回答