实例变量未在iOS应用程序中返回值

时间:2011-07-15 09:18:34

标签: iphone objective-c ios uitableview defaults

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

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

基于NSLog(@"%@", self);的方法,显示如下

<强> loadProviderDataSource

self: <ViewController: 0x83739b0> 

<强>的tableView:的cellForRowAtIndexPath

self: <ViewController: 0x8373170>

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

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