推送UITableViewControllers并过滤/重新加载数据

时间:2012-07-17 15:07:22

标签: objective-c cocoa-touch pointers

我认为这可能是一个我不理解的简单问题,但我花了很多时间来处理它并且它正在阻碍我的工作。

我有一个显示4行“主题”的UITableViewController。当你触摸一个时,它会创建我的UITableViewController类的一个实例,将数据源数组设置为“子主题”数组,并将控制器推送到导航堆栈。当我使用10行进入“全部”主题页面时,我有一个用于过滤结果的分段控件。我能够成功过滤数组但是当我将它分配给我的self.topicsDataSource并调用[self.tableView reloadData]时,没有任何反应。委托方法numberOfSections和numberOfRowsInSection,但不是cellForRowAtIndexPath。当我按下导航后退按钮时,它会返回到前一个表格,现在是我在顶部表格中想要的过滤结果。

所以这就是我认为正在发生的事情。 1.我实际上正在改变上一个表的数据源,并且正在该表上调用self.tableView.reloadData。 2.未调用cellForRowAtIndexPath,因为当时不再显示重新加载的tableview。

这是我实例化推送表视图的地方。这个类叫做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];

}

任何帮助将不胜感激。谢谢!

2 个答案:

答案 0 :(得分: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]; // 

}

答案 1 :(得分:0)

很难说出你的问题是什么以及发生了什么 - 我建议下次用更少的随机代码,更多的解释和更明显的问题(也更好的格式化)来提问)。反正。

尽我所知,self仍然指的是原始视图控制器。我不确定您的代码来自哪些类,但如果您希望这样做,则需要

  1. TopicsViewController
  2. 编写自定义类
  3. 推送/ etc
  4. 在自定义类中,定义数据源,重新加载等
  5. 在自定义类
  6. 中调用change datasource方法
  7. 在自定义类的reloadData上调用tableView方法。
  8. 重点是,确保您的所有工作都发生在自定义表视图数据控制器的类中。