0

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

我有一个显示 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];

}

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

4

2 回答 2

0

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

据我所知,self仍然指的是原始视图控制器。我不确定你的代码来自哪些类,但如果你想让它工作,你需要

  1. TopicsViewController
  2. 推它/等等
  3. 在自定义类内部,定义数据源,重新加载等
  4. 在自定义类中调用更改数据源方法
  5. 调用自定义类的reloadData方法。tableView

关键是,确保您的所有工作都发生在自定义表格视图数据控制器的类内部。

于 2012-07-17T15:37:20.810 回答
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 回答