我在UICollectionViewCell中有一个需要访问的函数 托管UIViewController。目前' makeContribution()'无法访问:
访问具有所需功能的主机UIViewController的正确方法是什么?
答案 0 :(得分:2)
感谢有见地的回复,这是通过委托的解决方案:
...
...
...
{makeContribution}
答案 1 :(得分:1)
这是一个有争议的问题 - 答案取决于你对MVC的理解。三个(可能很多)选项是:
将@IBAction
移至视图控制器。问题已解决,但在您的情况下可能无法实现。
创建委托。这将允许耦合松散 - 您可以使用ContributionDelegate
方法创建makeContribution()
协议,使视图控制器符合到它,然后将视图控制器指定为您的单元类中的weak var contributionDelegate: ContributionDelegate?
。然后你打电话:
contributionDelegate?.makeContribution()
运行NSResponder
链。 This answer在UIView
上有一个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.
}
}