ios – UICollectionView:激活,滚动到第一响应者并将其分配给远程单元

ios – UICollectionView:激活,滚动到第一响应者并将其分配给远程单元,第1张

概述我在UICollectionViewCell中有一个文本字段,可以接收第一响应者状态.当前在屏幕上看不到单元格,我想根据UISegmentedControl中的按钮滚动到单元格.这个控件有两个段……对第二个段的命中应该滚动到UICollectionView的第二个部分中的第一个单元格.发生这种情况后,应该以编程方式选择单元格,然后该单元格内的文本字段应该获得第一响应者状态并调出键盘. 现在发生的事 我在UICollectionVIEwCell中有一个文本字段,可以接收第一响应者状态.当前在屏幕上看不到单元格,我想根据UISegmentedControl中的按钮滚动到单元格.这个控件有两个段……对第二个段的命中应该滚动到UICollectionVIEw的第二个部分中的第一个单元格.发生这种情况后,应该以编程方式选择单元格,然后该单元格内的文本字段应该获得第一响应者状态并调出键盘.

现在发生的事情(在我的动作方法中,来自分段控件的值更改)是调用 – [UICollectionVIEw selectItemAtIndexPath:animated:scrollposition:]根本没有滚动到它(我正在使用UICollectionVIEwScrollpositiontop;可能如好吧“……没有”).如果我手动向下滑动列表,则确实选择了单元格(在该状态下它会获得较暗的背景颜色),但文本字段肯定没有第一响应者状态.

为了解决滚动问题,我已经能够确定列表中单元格的位置,并滚动到单元格的内容偏移量(我在这里也使用了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:]中看到的单元格是nil,因为当方法被触发时,它不在集合视图的可见单元格集中.

解决这个问题的最佳方法是什么?我已经尝试在[UIVIEw animateWithDuration:animations:completion:]块中抛出我的滚动代码,并在完成后分配第一个响应者,但是以这种方式手动动画集合视图忽略了加载应该滚动的任何单元格过去.有任何想法吗?

更新:非常感谢@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];    });}
解决方法 我在UItableVIEw上遇到了类似的挑战:滚动到一个尚未可见的单元格,并在目标单元格可见时将第一个响应者分配给目标单元格中​​的UITextFIEld.这是我如何处理这个的简化描述.我想这种方法可以使用UICollectionVIEw,但我对集合视图没有太多经验.

>如果当前可见所需的单元格/文本字段,请立即将其发送到firstFirstResponder,并根据需要滚动到该单元格.
>否则,在视图控制器或类似的类中设置一个属性,指示文本字段需要焦点,哪个需要焦点
>告诉表视图/集合视图以滚动到所需的索引路径
>在collectionVIEw:cellForItemAtIndexPath:中,您可以尝试检查该属性以查看给定indexPath上的文本字段是否需要获得焦点,如果是,立即将其发送到becomeFirstResponder,但我发现如果单元格是滚动到视图中,大概是因为此时,当您配置新单元格时,它实际上还不在视图层次结构中.所以我添加了一个检查,如果此时eventFirstResponder返回NO,我会在延迟后再试一次:

dispatch_after(someDelay,^(voID){    [self getFocus:textFIEld];});

getFocus方法都会将becomeFirstResponder发送到文本字段,并清除跟踪哪个文本字段需要关注的属性.

我的实际实现有点专门用于与我的表视图关联的视图模型,并封装在几个类中并使用一些KVO,但我想避免这种情况,并专注于上面描述中所需的最小逻辑.

总结

以上是内存溢出为你收集整理的ios – UICollectionView:激活,滚动到第一响应者并将其分配给远程单元全部内容,希望文章能够帮你解决ios – UICollectionView:激活,滚动到第一响应者并将其分配给远程单元所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1020950.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存