0

リポジトリからデータを取得して NSArray に詰め込むクラスがあります。

EpisodeRepository クラス

-(NSMutableArray *)getEpisodes {

NSMutableArray *episodes = [NSMutableArray array];

NSData *data = [self getDataFromAction:kGetEpisodesAction];
NSError *error = nil;
NSArray *json = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];

for (NSDictionary *d in json) {      
    Episode *episode = [self buildEpisodeFromJSONDictionary:d];
    [episodes addObject:episode];
}

return episodes;

}

私のView Controllerでは、レポとエピソードの配列への参照を次のように保持しています。

@interface VideoController : UITableViewController

@property (nonatomic, strong) NSArray *episodes;
@property (nonatomic, strong) EpisodeRepository *episodeRepo;

実装では、ビューが表示されるたびに、Web サービス (EpisodeRepository 内) からデータを再フェッチし、更新されたエピソードでテーブル ビューをリロードします。これは、テーブルビューが初めて作成されたときにうまく機能します。問題は、cellForRowAtIndexPath を呼び出すと、エピソード配列が完全に空白になることです。null ではありませんが、データはまったくありません。奇妙なことに、他のすべての tableView デリゲートは配列にデータがあることを認識し、それに応じて動作します。cellForRowAtIndexPath の何が特別で、配列内のエントリが削除される可能性があるのはなぜですか?

コントローラーの実装は次のとおりです。

-(id) initWithCoder:(NSCoder *)aDecoder {

self = [super initWithCoder:aDecoder];

if(self) {
    episodeRepo = [[EpisodeRepository alloc] init];
}

return self;

}

-(void)viewWillAppear:(BOOL)animated
{
    [self loadContent];
    [self.tableView reloadData];
    [super viewWillAppear:animated];
}

-(void) loadContent {    
    self.episodes = [self.episodeRepo getEpisodes];
    self.seasons = [self getSeasons:self.episodes];
    [self setUILoaded];
}

-(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
  //episodes is an empty array here???
}
4

1 に答える 1

0

解決策を見つけました!View Controllerの外側に配列を割り当てていたタブバーのwillSelectViewControllerの下に、App Delegateにコードがあったことがわかりました。教訓:これをしないでください!

于 2012-11-15T15:08:07.260 に答える