iOS-UIViewController、UITableView、UIScrollView和UISegmentedControl-oh my

iOS-UIViewController、UITableView、UIScrollView和UISegmentedControl-oh my,ios,uitableview,uiviewcontroller,uiscrollview,uisegmentedcontrol,Ios,Uitableview,Uiviewcontroller,Uiscrollview,Uisegmentedcontrol,简单地说,我有以下设置: UIViewController-这是主、父控制器 在这个主视图中,顶部有一个UIScrollView,下面有一个UITableView。 UITableView通过NSFetchedResultsController填充核心数据 UIScrollView UIViewController是此UIScrollView的委托 |-其中,我展示了2个UIView:1个包含一个UISegmentedControl,另一个只包含UILabels 当segmentedContro

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

UIViewController-这是主、父控制器

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

UIScrollView UIViewController是此UIScrollView的委托 |-其中,我展示了2个UIView:1个包含一个UISegmentedControl,另一个只包含UILabels

当segmentedControl的值更改时(即:用户单击它),我只想通过发出新的fetchRequest来重新加载UITableView的行列表,只需更改谓词并重新蚀刻到NSFetchedResultsController即可

然而,这正是我开始有问题的地方

每当我发出[tableView reloadData]时,最上面的UIScrollView不是UITableView的ScrollView,而是我添加到UIViewController中的额外的一个停止响应

在我发布[tableView reloadData]之前,滚动工作正常。发出后,scrollView停止响应,滚动完全停止

我尝试了以下所有方法:

[self.topScrollView设置CrollingEnabled:是] self.topScrollView.delegate=self; [self.topScrollView setContentSize:CGSizeMake640.0f,self.topScrollView.frame.size.height]; [self.topScrollView setContentOffset:CGPointMake0,0]; 我完全删除了UISegmentedControl。我所做的是在视图的最上方放置一个按钮,然后发出[tableView reloadData];。只有在重新加载tableView时,UIScrollView才会停止响应

这是虫子吗?我完全错过了什么吗?我能想到的唯一一件事是UITableView继承了UIScrollView,因此当表重新加载时,它必须做一些事情,使topScrollView失去所有内容偏移量/大小和/或其委托或其他意义

有人试过这个吗?有人有过这个问题吗

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

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

编辑:下面是一个基本的代码示例,说明我在将标题拆分为ContainerView并通过EmbeddedSegue加载它之前所做的工作:

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

您是否实现了任何滚动视图委托方法?因为正如您所说,表视图的委托也将充当滚动视图委托,所以表视图继承自滚动视图,因此您可能需要在委托方法中使用一些条件逻辑。就我个人而言,我会使用多个视图控制器和包含,但那只是我自己。在这个例子中,我没有实现任何UIScrollView委托,没有。但是,是的,我最终使用的是带有单个视图控制器的包含。只是不想这么做,但是,通过这样做,我得到了一些免费的抽象。。。对我来说,把它抽象出来并不重要,这就是它失败的原因=