得到细胞索引 - 偷看和流行

时间:2017-12-22 15:58:06

标签: ios objective-c cocoa-touch uicollectionview 3dtouch

我有一个集合视图,我正在尝试获取我正在偷看并弹出的单元格的索引。

问题

目前我正在使用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

截图

这是发生了什么,这正是我想要的。我唯一想做的事情就是当细胞被轻敲时也能够得到敲击细胞的索引。

enter image description here

故事板中的集合视图

(蓝色)UIView“链接”到集合视图控制器(下面第二个屏幕截图中的顶视图控制器)。

enter image description here enter image description here

1 个答案:

答案 0 :(得分:1)

原因: 问题的主要原因是如何在故事板中设置CollectionViewController。总之,这些是它的主要问题:

  1. 将CollectionViewController添加为UIViewController,然后将类更改为CollectionViewController,但问题是它是UICollectionViewController的子类。因此,故事板认为它与实际情况之间存在错失。您应该将其添加为UICollectionViewController以开始。
  2. CollectionViewControllers顶视图已经将它的类从UIView更改为UICollectionView,我认为这与UICollectionViewController的设置方式相匹配。所以这里再次出现一个未命中匹配,这意味着您无法在Interface Builder中看到任何正确的属性。
  3. 然后添加了一个额外的UICollectionView作为主CollectionViewController主视图的子视图。这将其数据源和委托链接到CollectionViewController类,并且是实际显示的类。它都是用原型单元正确设置的。但是,它没有作为IBOutlet链接到课程中,因此您无法引用它。
  4. 那么为什么这会导致你看到的问题。在您引用self.collectionView时,在CollectionViewController中,您指的是顶级的,而不是显示单元格的那个。那不是显示单元格的那个,实际上没有显示的单元格,因此当你在特定点请求单元格时,它将始终返回nil,因此你得到的行值为零。如果您能够访问实际显示单元格的UICollectionView,则可以获得正确的值。

    除此之外,还有其他问题尚未解决。

    解决方案: 这个问题基本上有两个主要的解决方案......

    1. 从故事板中删除CollectionViewController并将其再次添加为UICollectionViewController。这当然是解决它的理想方式,因为它将全部正确设置,但它需要再次在故事板中重新创建整个控制器,并不是绝对必要,因为你可以做方法2 ......
    2. 您可以修改故事板和设置,以正确反映您的设置并使其正常运行。
    3. 我尝试过方法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中名为&#39; collectionView&#39;的IBOutlet。所以对self.collectionView的所有引用现在指的是正确的东西。

      我不得不做的另一件事,但我不确定为什么要更改UITableViewController和UICollectionViewController的单元格标识符,以便它们不是&#39; Cell&#39;。我刚用过TableCell&#39;和&#39; CollectionCell&#39;。如果你不这样做,他们会因为某些原因而感到困惑。

      (我认为这就是我所做的一切,但如果不是,我确定你能够处理任何其他问题)

      完成所有操作后,self.collectionView将引用正确的内容,您将在- (UIViewController *) previewingContext:(id <UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location方法中获得正确的索引路径。

      奖金回合: 现在一些额外的奖励评论。您似乎也与TableViewController有同样的问题,尽管它目前似乎没有引起任何问题。你可能想要解决它。

      当我第一次运行项目时,无论如何我都看不到要向表中添加任何内容,因为文本字段和“添加”#39;按钮丢失了。原来是因为我使用的是iPhone 8模拟器,而不是iPhone X模拟器,一旦我切换一切都没问题,我就可以看到文本字段并且添加了&#39;按钮。这意味着你的界面不能正确地适应不同的设备尺寸(实际上),你应该真的解决这个问题。

      P P的结局比我想象的要长,但希望能解决问题。此外,当我访问git存储库时,我可以克隆它并进行更改。我显然没有承诺它们,因为它是你的存储库但是如果你在理解我做了什么以使它工作时有任何麻烦我可以将它们提交到你的主分支或作为一个新分支。