所以,简单地说,我有以下设置:
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];
}