'#selector'是指不暴露给Objective-C的方法

通过addTarget传递参数的新的Xcode 7.3通常为我工作,但在这种情况下,它将错误标题中。 有任何想法吗? 当我尝试将其更改为@objc时,会引发另一个问题

谢谢!

cell.commentButton.addTarget(self, action: #selector(FeedViewController.didTapCommentButton(_:)), forControlEvents: UIControlEvents.TouchUpInside) 

它正在调用的select器

 func didTapCommentButton(post: Post) { } 

在我的情况下,select器的function是private 。 一旦我删除了private的错误消失了。 同样适用于fileprivate

在斯威夫特4
您将需要添加@objc函数声明。 直到迅速4这是暗示推断。

您需要使用didTapCommentButton(_:)上的@objc属性来与#selector一起使用它。

你说你这样做,但你有另一个错误。 我的猜测是新的错误是Post不是一个与Objective-C兼容的types。 如果所有参数types及其返回types都与Objective-C兼容,则只能将方法公开给Objective-C。

你可以通过使Post作为NSObject一个子类来解决这个问题,但这并不重要,因为didTapCommentButton(_:)的参数不会是Post 。 动作函数的参数是动作的发送者 ,而发送者将是commentButton ,它可能是UIButton 。 你应该像这样声明didTapCommentButton

 @objc func didTapCommentButton(sender: UIButton) { // ... } 

然后,您将面临获取与点击的button对应的Post的问题。 有多种方式来获得它。 这是一个。

我收集(因为你的代码说cell.commentButton ),你正在build立一个表视图(或集合视图)。 由于你的单元格有一个名为commentButton的非标准属性,我认为这是一个自定义的UITableViewCell子类。 所以我们假设你的单元格是PostCell声明的PostCell

 class PostCell: UITableViewCell { @IBOutlet var commentButton: UIButton? var post: Post? // other stuff... } 

然后,您可以从button上查看层次结构以查找PostCell ,并从中获取post:

 @objc func didTapCommentButton(sender: UIButton) { var ancestor = sender.superview while ancestor != nil && !(ancestor! is PostCell) { ancestor = view.superview } guard let cell = ancestor as? PostCell, post = cell.post else { return } // Do something with post here } 

试着让select器指向一个包装函数,该函数又调用了你的委托函数。 这对我有效。

 cell.commentButton.addTarget(self, action: #selector(wrapperForDidTapCommentButton(_:)), forControlEvents: UIControlEvents.TouchUpInside) 

 func wrapperForDidTapCommentButton(post: Post) { FeedViewController.didTapCommentButton(post) }