我有一个集合视图,并且试图获取我正在窥视和弹出的单元格的索引。
问题
目前,我正在使用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
被“链接”到“集合视图控制器”(下面第二个屏幕快照中的顶部视图控制器)。 最佳答案
原因:
问题的主要原因是如何在情节提要中设置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(即,删除class属性中的UICollectionView)。现在,它只是真正的UICollectionView的持有者。
接下来,将在情节提要中设置的其余UICollectionView链接到CollectionViewController.h中名为“ collectionView”的IBOutlet,以便对self.collectionView的所有引用现在都指向正确的东西。
我还必须做一件事,但我不确定为什么要更改UITableViewController和UICollectionViewController的单元格标识符,以便它们都不都是“ Cell”。我只是使用了'TableCell'和'CollectionCell'。如果您不这样做,它们都会由于某种原因而感到困惑。
(我认为这是我所做的一切,但如果不能,那么我相信您将能够解决其他问题)
完成所有操作后,self.collectionView将引用正确的内容,您将在
- (UIViewController *) previewingContext:(id <UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location
方法中获得正确的索引路径。奖励回合:
现在一些额外的奖金评论。尽管TableViewController目前似乎没有引起任何问题,但您似乎也遇到了同样的问题。您可能要修复它。
当我第一次运行该项目时,我仍然看不到向表中添加任何内容,因为缺少文本字段和“添加”按钮。原来是因为我使用的是iPhone 8模拟器,而不是iPhone X模拟器,切换后一切正常,并且可以看到文本字段和“添加”按钮。这意味着您的界面不能正确地适应所有不同的设备尺寸(完全是这样),您应该真正解决该问题。
最终以比我想象的更长的时间,但希望能解决这个问题。另外,由于我有权访问git存储库,因此可以克隆它并进行更改。我显然没有提交它们,因为它是您的存储库,但是如果您在理解如何使它工作时遇到困难,我可以将它们以太提交到您的主分支或作为新分支。
关于ios - 获取细胞索引-偷看和流行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47944217/