これはおそらく私が理解していない単純な問題だと思いますが、私はそれに多くの時間を費やしており、私の仕事を妨げています.
4行の「トピック」を表示する UITableViewController があります。1 つに触れると、UITableViewController クラスのインスタンスが作成され、データ ソース配列が「サブトピック」の配列に設定され、コントローラーがナビゲーション スタックにプッシュされます。たとえば 10 行の「すべて」のトピック ページに移動すると、結果をフィルタリングするためのセグメント化されたコントロールが表示されます。配列を正常にフィルタリングできますが、それを自分の self.topicsDataSource に割り当てて [self.tableView reloadData] を呼び出すと、何も起こりません。デリゲート メソッド numberOfSections および numberOfRowsInSection ですが、cellForRowAtIndexPath はそうではありません。ナビゲーションの戻るボタンを押すと、前のテーブルに戻り、一番上のテーブルに必要なフィルター処理された結果が表示されます。
だからここで私は何が起こっていると思います。1. 前のテーブルのデータ ソースを実際に変更しており、そのテーブルで self.tableView.reloadData が呼び出されています。2. 再ロード中のテーブルビューはその時点では表示されないため、cellForRowAtIndexPath は呼び出されません。
ここで、テーブル ビューのプッシュをインスタンス化しています。このクラスは TopicsViewController と呼ばれます
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSNumber *idtopic = [[self.topicsDataSource objectAtIndex:indexPath.row] idtopic];
NSArray *subtopics = [DataManager getSubtopicsForTopic:idtopic];
if ([subtopics count] > 0) {
TopicsViewController *topicsVC = [[TopicsViewController alloc ] init];
topicsVC.tableView.rowHeight = 106;
topicsVC.parentTopicId = idtopic;
topicsVC.topicsDataSource = [NSMutableArray arrayWithArray:subtopics];
topicsVC.diseaseStateId = self.diseaseStateId;
topicsVC.title = [[self.topicsDataSource objectAtIndex:indexPath.row] topic];
[self.navigationController pushViewController:topicsVC animated:YES];
}
else if (![[self.topicsDataSource objectAtIndex:indexPath.row] topic]) {
//all topics was selected
TopicsViewController *topicsVC = [[TopicsViewController alloc] initWithNibName:nil bundle:nil];
topicsVC.tableView.rowHeight = 106;
NSMutableArray *mArray = [[NSMutableArray alloc] initWithArray:[DataManager getTopicsAtEndOfTree]];
topicsVC.allTopics = mArray;
topicsVC.topicsDataSource = topicsVC.allTopics;
topicsVC.diseaseStateId = self.diseaseStateId;
topicsVC.parentTopicId = [NSNumber numberWithInt:100];
UISegmentedControl *segControl = [[UISegmentedControl alloc] initWithItems:[[NSArray alloc] initWithObjects:@"All", @"Speaker Direct", @"Live Meeting", nil]];
[segControl addTarget:self action:@selector(segControlChanged:) forControlEvents:UIControlEventValueChanged];
[segControl setSegmentedControlStyle:UISegmentedControlStyleBar];
[segControl setSelectedSegmentIndex:0];
topicsVC.navigationItem.titleView = segControl;
topicsVC.tableView.dataSource = topicsVC;
[self.navigationController pushViewController:topicsVC animated:YES];
}....
ここでは、データをフィルタリングして tableView をリロードしています。
- (void)segControlChanged:(UISegmentedControl *)sender
{
self.allTopics = [NSMutableArray arrayWithArray:[DataManager getTopicsAtEndOfTree]];
if (sender.selectedSegmentIndex == 1) {
NSPredicate *pred = [NSPredicate predicateWithFormat:@"type == 2"];
NSMutableArray *mArr = [[NSMutableArray alloc] initWithArray:[self.allTopics filteredArrayUsingPredicate:pred]];
self.topicsDataSource = mArr;
}
else if (sender.selectedSegmentIndex == 2) {
NSPredicate *pred = [NSPredicate predicateWithFormat:@"type == 1"];
NSMutableArray *mArr = [[NSMutableArray alloc] initWithArray:[self.allTopics filteredArrayUsingPredicate:pred]];
self.topicsDataSource = mArr;
}
else {
NSMutableArray *mArr = [[NSMutableArray alloc] initWithArray:[DataManager getTopicsAtEndOfTree]];
self.topicsDataSource = mArr;
}
[self.tableView reloadData];
}
どんな助けでも大歓迎です。ありがとう!