1

所以,简单地说,我有以下设置:

UIViewController - 这是主要的 parentController

在这个主视图中,我在最顶部有一个 UIScrollView,在它下面有一个 UITableView。UITableView 通过 NSFetchedResultsController 填充核心数据...

UIScrollView(UIViewController 是这个 UIScrollView 的代表)|- 在这里面,我展示了 2 个 UIView:1 个包含 UISegmentedControl,另一个只包含 UILabels

当segmentedControl 的值发生变化时(即:用户单击它),我只想通过向NSFetchedResultsController 发出新的fetchRequest(只需更改谓词并重新获取)来重新加载UITableView 的行列表。

然而,这正是我开始遇到问题的地方。

每当我发出 [tableView reloadData] 时,最顶层的 UIScrollView(不是 UITableView 的 ScrollView,而是我添加到 UIViewController 中的额外)停止响应。

在我发出 [tableView reloadData] 之前,滚动效果很好。发出后,scrollView 停止响应,滚动完全停止。

我已经尝试了以下所有方法:

  • [self.topScrollView setScrollingEnabled:YES]
  • self.topScrollView.delegate = self;
  • [self.topScrollView setContentSize:CGSizeMake(640.0f, self.topScrollView.frame.size.height)];
  • [self.topScrollView setContentOffset:CGPointMake(0, 0)];

我完全删除了 UISegmentedControl。我所做的是在视图的最顶部放置一个按钮,然后发出 [tableView reloadData];。当 tableView 重新加载时, UIScrollView 停止响应。

这是一个错误吗?我在这里完全错过了什么吗?我什至可以开始想到的唯一一件事是 UITableView 继承自 UIScrollView,因此当表重新加载时,它必须做一些事情来导致 topScrollView 要么失去对 contentOffset/Size 和/或其委托的所有感觉,要么某物...

有没有人试过这个?有没有人遇到过这个问题?

我可以解决这个问题的唯一方法是创建一个 ContainerView,将标题拆分为它自己的 UIViewController,然后将该UIViewController 设置为 UIVScrollLView 委托并在那里处理整个标题。

虽然这可行 - 我有点困惑,并且真的很想知道是否存在更好的选择......

编辑:这是一个基本代码示例,说明我在将标题拆分为 ContainerView 并通过 embededSegue 加载它之前所做的事情:

-(void)viewDidLoad {

    [super viewDidLoad];
}

-(void)viewDidAppear:(BOOL)animated {

    [super viewDidAppear:animated];

    [self.topScrollView setContentSize:CGSizeMake(640.0f, self.topScrollView.frame.size.height)];
    [self.topScrollView setContentOffset:CGPointMake(0, 0)];
}

// .....

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"listItemCell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    // Load the cell with what is in core data at this index path..
    [self configureCell:cell atIndexPath:indexPath];

    return cell;
}


#pragma mark SegmentedControl Switch

- (IBAction)segmentedControlValueChanged {

    NSFetchRequest *aRequest = [[self fetchedResultsController] fetchRequest];
    NSPredicate *predicate;

    switch(self.segmentedControl.selectedSegmentIndex) {
        case 0:
            predicate = [NSPredicate predicateWithFormat:@"status = %@", @"incomplete"];
        break;

        case 1:
            predicate = [NSPredicate predicateWithFormat:@"status = %@", @"complete"];
        break;

        case 2:
            predicate = [NSPredicate predicateWithFormat:@"status = %@", @"deleted"];
        break;

        default:
            predicate = [NSPredicate predicateWithFormat:@"status = %@", @"none"];
        break;
    }

    [aRequest setPredicate:predicate];

    NSError *error = nil;
    if (![[self fetchedResultsController] performFetch:&error]) {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }

    [self.tableView reloadData];

//    self.topScrollView.delegate = self;
//    [self.topScrollView setContentSize:CGSizeMake(640.0f, self.topScrollView.frame.size.height)];
//    [self.topScrollView setContentOffset:CGPointMake(0, 0)];
//    [self.topScrollView setScrollEnabled:YES];
}
4

0 回答 0