iOS-UIViewController、UITableView、UIScrollView和UISegmentedControl-oh my
简单地说,我有以下设置: 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加载它之前所做的工作: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
-(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委托,没有。但是,是的,我最终使用的是带有单个视图控制器的包含。只是不想这么做,但是,通过这样做,我得到了一些免费的抽象。。。对我来说,把它抽象出来并不重要,这就是它失败的原因=