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

时间:2016-04-24 00:48:44

标签: xcode swift

通过addTarget传递参数的新Xcode 7.3通常对我有用,但在这种情况下,它会在标题中抛出错误。有任何想法吗?当我尝试将其更改为@objc

时,它会抛出另一个

谢谢!

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

它正在调用的选择器

func didTapCommentButton(post: Post) {
}

4 个答案:

答案 0 :(得分:166)

在我的情况下,选择器的功能是private。删除private后,错误消失了。同样适用于fileprivate

在Swift 4中
您需要将@objc添加到函数声明中。直到快速4,这是隐含的推断。

答案 1 :(得分:54)

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

你说你做到了但是又出现了另一个错误。我的猜测是新错误是Post不是与Objective-C兼容的类型。如果方法的所有参数类型及其返回类型与Objective-C兼容,则只能向Objective-C公开方法。

您可以通过将Post作为NSObject的子类来解决这个问题,但这并不重要,因为didTapCommentButton(_:)的参数不会是{{1}无论如何。操作函数的参数是操作的发件人,发件人将是Post,大概是commentButton。你应该像这样声明UIButton

didTapCommentButton

然后,您将面临获取与点按按钮对应的@objc func didTapCommentButton(sender: UIButton) { // ... } 的问题。有多种方法可以获得它。这是一个。

我收集(因为您的代码显示为Post),您正在设置表格视图(或集合视图)。由于您的单元格具有名为cell.commentButton的非标准属性,因此我假设它是自定义commentButton子类。因此,让我们假设您的单元格是UITableViewCell,声明如下:

PostCell

然后,您可以从按钮向上查看视图层次结构以查找class PostCell: UITableViewCell { @IBOutlet var commentButton: UIButton? var post: Post? // other stuff... } ,并从中获取帖子:

PostCell

答案 2 :(得分:8)

尝试让选择器指向包装函数,该函数又调用您的委托函数。这对我有用。

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

-

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

答案 3 :(得分:0)

您知道selector [About]说应该使用Objective-C运行时。默认情况下,标记为privatefileprivate的声明不会暴露给Objective-C运行时。这就是为什么您有两个变体的原因:

  1. 通过private [About]标记您的fileprivate@objc声明
  2. 使用internalpublicopen访问修饰符[About]