获取单元格索引 - Peek and Pop
Posted
技术标签:
【中文标题】获取单元格索引 - Peek and Pop【英文标题】:Get Index of Cell - Peek and Pop 【发布时间】:2017-12-22 15:58:06 【问题描述】:我有一个集合视图,我正在尝试获取我正在查看和弹出的单元格的索引。
问题
目前我使用的是indexPathForItemAtPoint:
,但是无论我在屏幕上的哪个位置点击,这个总是返回0
。
代码
集合视图控制器:
- (void)viewDidLoad
[super viewDidLoad];
[self registerForPreviewingWithDelegate:self sourceView:self.collectionView];
- (UIViewController *) previewingContext:(id <UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location
CellEditViewController *CEVC = [self.storyboard instantiateViewControllerWithIdentifier:@"detail"]; //The view I want peek/pop to
NSLog(@"Location: %f,%f", location.x, location.y);
NSLog(@"Index of: %lu", [[self.collectionView indexPathForItemAtPoint:location] row]);
[CEVC setPreferredContentSize:CGSizeMake(0.0, 320.0)];
return CEVC;
- (void)previewingContext:(id <UIViewControllerPreviewing>)previewingContext commitViewController:(UIViewController *)viewControllerToCommit
[self showViewController:viewControllerToCommit sender:self];
我尝试过的
创建一个新位置来识别索引单元格。 将registerForPreviewingWithDelegate:sourceView:
移动到我创建每个单元格的位置。
将previewingContext:viewControllerForLocation:
和previewingContext:commitViewController:
移动到单元格视图方法,由于其他原因,这不起作用。
我不认为这是预览的问题,因为当我使用 UITapGestureRecognizer
实现相同的事情时,我得到了类似的输出:
点击识别器:
- (void) processDoubleTap:(UITapGestureRecognizer *)sender
NSLog(@"Got tapped twice");
if (sender.state == UIGestureRecognizerStateEnded)
CGPoint point = [sender locationInView:self.collectionView];
NSIndexPath *indexPath = [self.collectionView indexPathForItemAtPoint:point];
NSLog(@"Index was: %lu", [indexPath row]);
if (indexPath)
NSLog(@"Index was double tapped");
输出:
2017-12-25 10:48:13.990523-0800 quickthings[3052:356150] Got tapped twice
2017-12-25 10:48:13.990843-0800 quickthings[3052:356150] Index was: 0
来源
Github Repository
截图
这就是发生的事情,这正是我想要的。我唯一想做的另一件事是当单元格被点击时也能够获得被点击单元格的索引。
故事板中的收藏视图
(蓝色)UIView
“链接”到集合视图控制器(下面第二个屏幕截图中的顶部视图控制器)。
【问题讨论】:
[self registerForPreviewingWithDelegate:self sourceView:self.collectionview];
? (见:***.com/questions/33002637/…)
感谢您的建议,但还是同样的问题 :(
我之前没有使用过这个功能,所以我设置了一个非常基本的测试(在 Swift 中,但这不重要),它可以按您的预期工作。这让我相信这是你所展示的东西之外的东西。您是否有更多信息(代码、示例等)可能有助于阐明这一点?
@UpholderOfTruth 我已经添加了回购和截图,这有帮助吗?如果您想让我添加任何其他内容,请告诉我。感谢您的帮助!
我快速浏览了一下,您的问题在于情节提要中 CollectionViewController 的设置。我才刚进去,已经过了午夜,所以我现在已经厌倦了解释,但我明天会尝试一个(实际上是今天晚些时候)。
【参考方案1】:
原因: 问题的主要原因是如何在情节提要中设置 CollectionViewController。总之,这些是它的主要问题:
-
CollectionViewController 作为 UIViewController 添加,然后类更改为 CollectionViewController,但问题是它是 UICollectionViewController 的子类。因此,故事板认为的内容与实际内容之间存在不匹配。您应该首先将其添加为 UICollectionViewController。
CollectionViewControllers 顶视图的类已从 UIView 更改为 UICollectionView,我认为这与 UICollectionViewController 的设置方式相匹配。所以这里再次出现未匹配,这意味着您在 Interface Builder 中看不到任何正确的属性。
然后添加了一个额外的 UICollectionView 作为主 CollectionViewController 主视图的子视图。它的数据源和委托链接到 CollectionViewController 类,并且是实际显示的。所有这些都使用原型单元正确设置。但是它没有作为 IBOutlet 链接到类中,因此您无法引用它。
那么为什么这会导致您看到的问题。在 CollectionViewController 中,当您引用 self.collectionView 时,您指的是顶层,它不是显示单元格的那个。那不是显示单元格的那个,实际上没有显示单元格,因此当您在特定点请求单元格时,它将始终返回 nil,因此您得到的行值为零。如果您能够访问实际显示单元格的 UICollectionView,您可以获得正确的值。
除此之外,您还没有遇到其他问题。
解决方案: 这个问题基本上有两种主要的解决方案...
-
从情节提要中删除 CollectionViewController 并再次将其添加为 UICollectionViewController。这当然是解决它的理想方法,因为它将全部正确设置,但是它需要再次在情节提要中重新创建整个控制器,并且不是绝对必要的,因为您可以执行方法 2...
您可以修改情节提要和设置,以正确反映您的设置并使其正常工作。
我已经尝试了方法 2,这是我必须做的才能让它正常工作:
将 CollectionViewController 从 UICollectionViewController 的子类更改为 UIViewController 的子类,因为它将成为 UICollectionView 的持有者。您还需要使其直接支持 UICollectionViewDataSource 和 UICollectionViewDelegate,因为 UICollectionViewController 已经这样做了,但 UIViewController 没有。所以在 CollectionViewController.m 中修改这一行:
@interface CollectionViewController : UICollectionViewController
到这里:
@interface CollectionViewController : UIViewController <UICollectionViewDelegate, UICollectionViewDataSource>
接下来在故事板中将 CollectionViewController 的***视图更改回 UIView(即删除类属性中的 UICollectionView)。它现在只是一个真正的 UICollectionView 的持有者。
接下来将故事板中设置的剩余 UICollectionView 链接到 CollectionViewController.h 中名为“collectionView”的 IBOutlet,以便所有对 self.collectionView 的引用现在都指向正确的东西。
我必须做的另一件事是,但我不确定为什么要更改 UITableViewController 和 UICollectionViewController 的单元格标识符,以使它们不都是“单元格”。我刚刚使用了“TableCell”和“CollectionCell”。如果你不这样做,他们都会出于某种原因感到困惑。
(我认为这就是我所做的一切,但如果不是,我相信您将能够处理任何其他问题)
完成所有操作后,self.collectionView 将引用正确的内容,您将在 - (UIViewController *) previewingContext:(id <UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location
方法中获得正确的索引路径。
奖金回合: 现在有一些额外的奖励cmets。您似乎对 TableViewController 也有同样的问题,尽管它目前似乎没有引起任何问题。不过你可能想修复它。
当我第一次运行该项目时,由于缺少文本字段和“添加”按钮,我无论如何都看不到要向表中添加任何内容。原来这是因为我使用的是 iPhone 8 模拟器而不是 iPhone X 模拟器,一旦切换一切正常,我可以看到文本字段和“添加”按钮。这意味着您的界面没有正确适应不同的设备尺寸(实际上),您应该真正解决这个问题。
唷,这比我想象的要长,但希望能解决问题。此外,由于我可以访问 git 存储库,因此我可以克隆它并进行更改。我显然没有提交它们,因为它是您的存储库,但如果您无法理解我为使其工作所做的工作,我可以将它们提交到您的主分支或作为新分支。
【讨论】:
非常感谢您的回答!我终于使用您提供的第一个解决方案进行了强制触摸工作。唯一的问题是现在我无法设置任何文本标签,不确定那是什么 - 有什么想法吗?再次感谢您的惊人回答。编辑:看起来我实际上无法编辑CollectionViewCell
的任何自定义属性。
如果你想看一下,我已经更新了repo中的代码。
我已经拿出了最新版本。您要在哪里更新 CollectionViewCell?
它在CollectionViewController
,第 125 行。这里:github.com/pudility/quick-things/blob/master/quickthings/src/… - 或者更具体地说,这里:github.com/pudility/quick-things/blob/master/quickthings/src/… 再次感谢您的帮助!
我进行了拉取,但未找到 FetchSettings.h。以上是关于获取单元格索引 - Peek and Pop的主要内容,如果未能解决你的问题,请参考以下文章
Peek-and-Pop UIView 以显示 SFSafariViewController