插入从Xib加载的UICollectionView的附加视图

时间:2015-06-23 16:16:10

标签: ios objective-c uicollectionview xib uicollectionviewcell

对于使用Xib进行UICollectionViewCells,我遇到了一个奇怪的问题。问题是正在创建一个额外的视图,这似乎是在所有事情之上,使我的手势和IBActions无用。

这是我的设置:

  • 我有一个带有UICollectionView的UIViewController。

  • 在故事板中,UICollectionView有一个单元格,类为“MyCell”,重用ID为“cell”

  • cellForItemAtIndexPath中,我只返回[collectionView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath]的结果。我还在numberOfItemsInSection中硬编码了30个项目。

就是这样。除此之外,我还有MyCell.h,MyCell.m和MyCell.xib。

  • xib包含单个UIButton,其Touch Up Inside事件设置为调用buttonPressed IBAction。视图本身设置为MyCell类,标签设置为123(我们将在下面找到原因)。

  • 在MyCell.m中,我覆盖了awakeAfterUsingCoder以返回[MyCell initView:self]initView的定义位于底部。但它基本上从Xib加载视图。

就是这样。

当我运行应用程序时,会显示30个单元格,所有单元格都有按钮,但按下按钮时没有任何反应。经过很多的调查后,我发现在单元格内部添加了一个额外的UIView,它位于按钮顶部,它覆盖整个事物。

如果我在awakeAfterUsingCoder内添加for循环,则按钮会再次运行。

    - (MyCell *)awakeAfterUsingCoder:(NSCoder *)aDecoder
    {
        MyCell *cell = [MyCell initView:self];
        for(UIView *v in cell.subviews){
            if(![v isKindOfClass:[UIButton class]]) [v removeFromSuperview];
        }
        return cell;
    }

我的问题是:那是什么观点,为什么会有?即使我可以通过删除该视图来完成所有工作,但感觉就像是黑客。

谢谢!如有必要,我可以回答任何其他问题。

    + (id)initView:(UIView *)viewToInit
    {
        UIView *viewToReturn;

        if(viewToInit.tag != 123){
            //If we're in the storyboard codepath

            //Initialize from the xib.
            //If the code below is failing, we probably forgot the 666 tag :/
            viewToReturn = [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass([viewToInit class])
                                                          owner:nil
                                                        options:nil] firstObject];

            //copy frame, autoresizing, and layour items.
            viewToReturn.frame = viewToInit.frame;
            viewToReturn.autoresizingMask = viewToInit.autoresizingMask;
            viewToReturn.translatesAutoresizingMaskIntoConstraints = viewToInit.translatesAutoresizingMaskIntoConstraints;

            for (NSLayoutConstraint *constraint in viewToInit.constraints){
                id firstItem = constraint.firstItem;
                if (firstItem == viewToInit){
                    firstItem = viewToReturn;
                }
                id secondItem = constraint.secondItem;
                if (secondItem == viewToInit){
                    secondItem = viewToReturn;
                }

                [viewToReturn addConstraint:[NSLayoutConstraint constraintWithItem:firstItem
                                                                         attribute:constraint.firstAttribute
                                                                         relatedBy:constraint.relation
                                                                            toItem:secondItem
                                                                         attribute:constraint.secondAttribute
                                                                        multiplier:constraint.multiplier
                                                                          constant:constraint.constant]];
            }
        }else{
            //otherwise do nothing and just return what was passed in
            viewToReturn = viewToInit;
        }

        return viewToReturn;
    }

2 个答案:

答案 0 :(得分:2)

我本人只是遇到了这个问题,答案就在单元格nib文件中。如果您创建了一个笔尖,并且使用包含的普通UIView作为单元格,那么问题就出在这里。需要立即删除此UIView,并替换为新拖放的UICollectionViewCell。这将成为您的单元格,您可以将视图添加到您的心脏内容中,而不会出现其他问题。

答案 1 :(得分:1)

好的,所以经过很长一段时间在那里讨论这个问题后,我已经弄明白了。

问题是UICollectionViewCell的contentView被插入到我的视图之上。这对我来说很奇怪,因为UITableViewCells也没有内容视图。

我当时所做的就是把所有东西放在一个容器中#34;查看然后将该容器视图移动到init上的contentView中,并解决了这个问题。

我仍然不明白为什么会这样。在我看来,我的所有观点都应该添加到contentView中(就像表格的单元格一样),但至少我现在可以解决它。