0

これはおそらく私が理解していない単純な問題だと思いますが、私はそれに多くの時間を費やしており、私の仕事を妨げています.

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];

}

どんな助けでも大歓迎です。ありがとう!

4

2 に答える 2

0
- (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;
    }

[tableView reloadData]; // 

}
于 2012-07-17T15:34:18.137 に答える
0

あなたの質問が何であり、何が起こっているのかを伝えることは非常に困難です.次回は、ランダムなコードを減らし、説明を増やし、より明白な質問をすることをお勧めします. ともかく。

私が知る限りself、元のView Controllerを参照しています。コードがどのクラスから来ているのかわかりませんが、これを機能させたい場合は、

  1. のカスタムクラスを書くTopicsViewController
  2. 押す/など
  3. カスタム クラス内で、データソース、リロードなどを定義します。
  4. カスタム クラス内で change datasource メソッドを呼び出す
  5. カスタム クラスの でreloadDataメソッドを呼び出します。tableView

ポイントは、すべての作業がカスタム テーブル ビュー データ コントローラーのクラス内で行われることを確認することです。

于 2012-07-17T15:37:20.810 に答える