0

この問題は、インスタンス変数が iOS アプリケーションで値を保持していないことに関連している可能性があります。

私のアプリケーションには、plist からのデータが入力されるはずのテーブル ビューがあります。plist is question は、デフォルト設定に基づいて決定されます。

インスタンス変数の内容を設定した後、それをカウントすると、複数のレコードが含まれていることが示されます。ただし、後でテーブル ビュー セルを描画するときにこのインスタンス変数をカウントしようとすると、レコードが表示されません。

--

クラス ヘッダーで「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);次のように表示される両方の方法に基づいています

loadProviderDataSource

self: <ViewController: 0x83739b0> 

tableView:cellForRowAtIndexPath

self: <ViewController: 0x8373170>

ViewControllerどういうわけかの2番目のインスタンスを作成しているようです。

それらの 1 つが XIB を使用して作成されていることを理解しています。プログラムで別のものを作成しているかどうかを確認します。

于 2011-07-15T10:23:48.423 に答える