したがって、簡単に言えば、次の設定があります。
UIViewController - これはメインのparentControllerです
このメイン ビュー内で、一番上に UIScrollView があり、その下に UITableView があります。UITableView には、NSFetchedResultsController を介してコア データが取り込まれます...
UIScrollView (UIViewController はこの UIScrollView のデリゲートです) |- この中に、表示する 2 つの UIView があります。1 つは UISegmentedControl を含み、もう 1 つは UILabels だけを含みます。
segmentedControl の値が変更された場合 (つまり、ユーザーがクリックした場合)、NSFetchedResultsController に新しい fetchRequest を発行して (述語を変更して再フェッチするだけで)、UITableView の行のリストをリロードしたいだけです。
しかし、それはまさに私が問題を抱え始めたところです。
[tableView reloadData] を発行するたびに、最上位の UIScrollView (UITableView の ScrollView ではなく、UIViewController に追加した追加のもの) が応答を停止します。
[tableView reloadData] を発行する前は、スクロールは問題なく機能していました。発行した後、scrollView が応答を停止し、スクロールが完全に停止します。
私は次のすべてを試しました:
- [self.topScrollView setScrollingEnabled:YES]
- self.topScrollView.delegate = 自己;
- [self.topScrollView setContentSize:CGSizeMake(640.0f, self.topScrollView.frame.size.height)];
- [self.topScrollView setContentOffset:CGPointMake(0, 0)];
UISegmentedControl を完全に削除しました。代わりに、ビューの一番上にボタンを配置し、[tableView reloadData]; を発行しました。UIScrollView が応答を停止するのは、tableView がリロードされるときです。
これはバグですか?ここで何かが完全に欠けていますか?私が考え始めることができる唯一のことは、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];
}