如何从Collection Cell中访问View Controller功能?

时间:2014-11-17 04:45:54

标签: swift uicollectionviewcell

我在UICollectionViewCell中有一个需要访问的函数 托管UIViewController。目前' makeContribution()'无法访问:

enter image description here

访问具有所需功能的主机UIViewController的正确方法是什么?

3 个答案:

答案 0 :(得分:2)

感谢有见地的回复,这是通过委托的解决方案:

enter image description here

...

enter image description here

...

enter image description here

...

enter image description here

{makeContribution}

答案 1 :(得分:1)

这是一个有争议的问题 - 答案取决于你对MVC的理解。三个(可能很多)选项是:

  1. @IBAction移至视图控制器。问题已解决,但在您的情况下可能无法实现。

  2. 创建委托。这将允许耦合松散 - 您可以使用ContributionDelegate方法创建makeContribution()协议,使视图控制器符合到它,然后将视图控制器指定为您的单元类中的weak var contributionDelegate: ContributionDelegate?。然后你打电话:

    contributionDelegate?.makeContribution()
    
  3. 运行NSResponder链。 This answerUIView上有一个Swift扩展程序,可以找到第一个父视图控制器,因此您可以使用的是:

    extension UIView {
        func parentViewController() -> UIViewController? {
            var parentResponder: UIResponder? = self
            while true {
                if parentResponder == nil {
                    return nil
                }
                parentResponder = parentResponder!.nextResponder()
                if parentResponder is UIViewController {
                    return (parentResponder as UIViewController)
                }
            }
        }
    }
    
    // in your code:
    if let parentVC = parentViewController() as? MyViewController {
        parentVC.makeContribution()
    }
    

答案 2 :(得分:0)

那么,CollectionView还是TableView?

无论如何,将ViewController设置为单元格的代表。像这样:

@objc protocol ContributeCellDelegate {
     func contributeCellWantsMakeContribution(cell:ContributeCell)
}

class ContributeCell: UICollectionViewCell {

    // ...

    weak var delegate:ContributeCellDelegate?

    @IBAction func contributeAction(sender:UISegmentedControl) {
        let isContribute = (sender.selectedSegmentIndex == 1)

        if isContribute {
            self.delegate?.contributeCellWantsMakeContribution(self)
        }
        else {
        }
    }
}


class ViewController: UIViewController, UICollectionViewDataSource, ContributeCellDelegate {

    // ...

    func collectionView(_ collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        cell = ...

        if cell = cell as? ContributeTableViewCell {
            cell.delegate = self
        }

        return cell
    }

    // MARK: ContributeCellDelegate methods

    func contributeCellWantsMakeContribution(cell:ContributeCell) {
        // do your work.
    }
}