iOS:知道点击了哪个UITableView Cell

时间:2015-10-13 14:24:40

标签: ios swift uitableview uicollectionview

我已经四处寻找这个问题了,并没有找到适合我案例的答案。基本上,我有一个tableView,其中每个单元格包含一个collectionView。我想要做的是刷新滚动collectionView的特定TableViewCell,以便在TableViewCell中更新CollectionView下的标签。

因此,当用户在collectionView上滚动时,我需要知道collectionView在哪个单元格中。我已经尝试过使用didSelectRowAtIndexPath,但是,只有在点击单元格的非CollectionView部分时才会调用它。当轻触或滚动collectionView时,它不会被调用。我在Swift编码。

关于我如何做到这一点的任何想法?

谢谢!

3 个答案:

答案 0 :(得分:2)

这似乎是一个架构问题。当然,它可以按照你想要的方式完成,但是如果你重新排列了一些东西会更容易。您希望如何执行此操作存在根本问题。您希望直接从视图控制器管理所有单元格及其集合视图。但这带来了需要知道消息来自何处以及将消息引导回正确的单元和集合视图的问题。这将创建大量的膨胀,可以使用简单的UITabelViewCell子类进行修复。这也是收缩Massive View Controller综合症的一个步骤。相反,您应该让各个单元负责管理自己的集合视图。

首先,使UITableViewCell自己成为UICollectionView的委托和数据源。这样可以集中数据,并更加紧密地模拟您在屏幕上实际看到的数据树。

class CollectionTableViewCell: UITableViewCell {

    @IBOutlet var collectionView: UICollectionView! {
        didSet(newCollectionView) {
            newCollectionView.delegate = self;
            newCollectionView.dataSource = self;
        }
    }

    var model: NSArray?


    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }
}

extension CollectionTableViewCell: UICollectionViewDelegate, UICollectionViewDataSource {


    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return model?.count ?? 0
    }

    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        var cell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath)

        // configure cell

        return cell
    }

}

现在,您希望在集合视图滚动时进行状态刷新。因此,我们将在原型单元格中为单元格添加标签(Nib或Storyboard。)

@IBOutlet var indicatorLabel: UILabel!

并且您希望在滚动集合视图时更新它。我们可以使用UIScrollViewDelegate协议的scrollViewDidScroll方法来实现。因为UICollectionViewDelegate实现了UIScrollViewDelegate,所以我们可以使用它,因为我们在扩展中实现了UICollectionViewDelegate。

// in the CollectionTableViewCell extension...
func scrollViewDidScroll(scrollView: UIScrollView) {
    let scrollViewOffset = scrollView.contentOffset.x
    let scrollViewWidth = CGRectGetWidth(scrollView.frame)
    let completionString = String(format: "%@ / %@", scrollViewOffset, scrollViewWidth)
    self.indicatorLabel.text = completionString
}

因此,通过让单个单元格负责自己受尊重的集合视图,我们可以更轻松地管理它们。它允许我们组织我们的代码更紧凑,可理解,并使我们无法获得Massive View Controller综合症。您可以移出视图控制器的代码越多越好。

听到这个问题的一些好的谈话将是:
WWDC 2014 – Advanced iOS Application Architecture and Patterns
Let's Play: Refactor the Mega Controller!

答案 1 :(得分:1)

您可以使用tag的{​​{1}}属性。将UITableViewCell设置为tag个数字,并在点击单元格时,获取row属性以找出抽头单元格索引。

答案 2 :(得分:0)

您的CollectionView将包含在某种单元格中。找到此单元格后,可以向表格询问索引。从CollectionView向上导航到视图层次结构以查找单元格。例如:

CollectionView* collectionView = // your collectionView;
UITableViewCell* cell = (UITableViewCell*)[collectionView superview];
UITableView* table = (UITableView *)[cell superview];
NSIndexPath* pathOfTheCell = [table indexPathForCell:cell];
NSInteger rowOfTheCell = [pathOfTheCell row];
NSLog(@"rowofthecell %d", rowOfTheCell);