У меня есть текстовое поле внутри UICollectionViewCell
, которое может получать статус первого ответчика. Ячейка в настоящее время не отображается на экране, и я хочу прокрутить до ячейки, исходя из нажатия кнопки с UISegmentedControl
. Для этого контроля есть два сегмента ... и удар во второй сегмент должен прокручиваться до первой ячейки во 2-й секции UICollectionView
. После этого ячейка должна выбираться программно, а затем текстовое поле внутри этой ячейки должно получить статус первого ответчика и вызвать клавиатуру.UICollectionView: активирование, прокрутка и назначение первого ответчика удаленной ячейке
Что происходит сейчас (в моем методе действий от изменения значения из сегментированного управления) является то, что вызов -[UICollectionView selectItemAtIndexPath:animated:scrollPosition:]
не прокрутка к нему на всех (и я использую UICollectionViewScrollPositionTop
, может также быть «…None
»). Если я распечатаю список вручную, ячейка действительно выбрана (в этом состоянии будет более темный цвет фона), но текстовое поле, конечно, не имеет первого статуса ответчика.
Чтобы устранить проблему прокрутки, мне удалось определить положение ячейки в списке и прокрутить до смещения содержимого ячейки (здесь также используется scrollRectToVisible
). Затем я вручную выбираю его (а также сообщаю делегату, чтобы он запускал соответствующий метод, где текстовое поле ячейки получает статус первого ответчика).
- (void)directionSegmentedControlChanged:(UISegmentedControl *)sender {
NSIndexPath *path = [NSIndexPath indexPathForItem:0 inSection:sender.selectedSegmentIndex];
UICollectionViewLayoutAttributes *attributes = [self.collectionView layoutAttributesForItemAtIndexPath:path];
[self.collectionView setContentOffset:attributes.frame.origin animated:YES];
[self.collectionView selectItemAtIndexPath:path animated:NO scrollPosition:UICollectionViewScrollPositionNone];
[self.collectionView.delegate collectionView:self.collectionView didSelectItemAtIndexPath:path];
}
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
BDKCollectionViewCell *cell = (BDKCollectionViewCell *)[collectionView cellForItemAtIndexPath:indexPath];
[cell.textField becomeFirstResponder];
}
Проблема здесь состоит в том, что клетка, как это видно в -[collectionView:didSelectItemAtIndexPath:]
равна нулю, потому что это не в видимом множестве ячеек представления коллекции, когда метод увольняют.
Каков наилучший способ решить эту проблему? Я попытался подбросить свой код прокрутки внутри блока [UIView animateWithDuration:animations:completion:]
и назначил первого ответчика после его завершения, но вручную анимируя представление коллекции таким образом, пренебрегает загрузкой любой из ячеек, которые должны прокручиваться мимо. Есть идеи?
Update: большое спасибо @Esker, который предложил мне просто выполнить «фокус выбора» действие после задержки с использованием Grand Central Dispatch. Мое решение оказалось таким.
- (void)directionSegmentedControlChanged:(UISegmentedControl *)sender {
NSIndexPath *path = [NSIndexPath indexPathForItem:0 inSection:sender.selectedSegmentIndex];
UICollectionViewLayoutAttributes *attributes = [self.collectionView layoutAttributesForItemAtIndexPath:path];
[self.collectionView setContentOffset:attributes.frame.origin animated:YES];
dispatch_time_t startAfter = dispatch_time(DISPATCH_TIME_NOW, 0.28 * NSEC_PER_SEC);
dispatch_after(startAfter, dispatch_get_main_queue(), ^{
[self.collectionView selectItemAtIndexPath:path animated:NO scrollPosition:UICollectionViewScrollPositionNone];
[self collectionView:self.collectionView didSelectItemAtIndexPath:path];
});
}
Работает как очарование! Благодаря! –