如何从UICollectionViewCell中调用presentViewController

从一个UIViewController调用这个函数没有问题,但是从一个UICollectionViewCell调用它会引发一个预编译错误

function:

 func didTapShare(sender: UIButton) { let textToShare = "Swift is awesome! Check out this website about it!" if let myWebsite = NSURL(string: "http://www.google.com/") { let objectsToShare = [textToShare, myWebsite] let activityVC = UIActivityViewController(activityItems: objectsToShare, applicationActivities: nil) activityVC.excludedActivityTypes = [UIActivityTypeAirDrop, UIActivityTypeAddToReadingList] activityVC.popoverPresentationController?.sourceView = sender self.presentViewController(activityVC, animated: true, completion: nil) } } 

错误:

你的单元没有成员presentViewController

该怎么办?

UITableViewCell不应该处理任何业务逻辑。 它应该在视图控制器中实现。 你应该使用一个委托:

UICollectionViewCell子类:

 protocol CustomCellDelegate: class { func sharePressed(cell: MyCell) } class CustomCell: UITableViewCell { var delegate: CustomCellDelegate? func didTapShare(sender: UIButton) { delegate?.sharePressed(cell: self) } } 

视图控制器:

 class TableViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { @IBOutlet weak var tableView: UITableView! //... func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as! CustomCell cell.delegate = self return cell } } extension TableViewController: CustomCellDelegate { func sharePressed(cell: CustomCell) { guard let index = tableView.indexPath(for: cell)?.row else { return } //fetch the dataSource object using index } } 

这是因为presentViewController是一个UIViewController方法, UITableViewCell没有一个名为presentViewController的方法。

该怎么办?

您可以使用委托模式来处理访问button的动作(作为@alexburtnik答案),或者 – 为了保存一些额外的工作,我build议通过tag来识别viewController中的单元button的操作。

注意:Swift 3代码。

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") as! TableViewCell cell.myButton?.tag = indexPath.row cell.myButton?.addTarget(self, action: #selector(), for: .touchUpInside) return cell } func namesIsTapped(tappedButton: UIButton) { // get the user (from users array for example) by using the tag, for example: let currentUser = users[tappedButton.tag] // do whatever you want with this user now... } 

希望有所帮助。