通过addTarget传递参数的新Xcode 7.3通常对我有用,但在这种情况下,它会在标题中抛出错误。有任何想法吗?当我尝试将其更改为@objc
时,它会抛出另一个谢谢!
cell.commentButton.addTarget(self, action: #selector(FeedViewController.didTapCommentButton(_:)), forControlEvents: UIControlEvents.TouchUpInside)
它正在调用的选择器
func didTapCommentButton(post: Post) {
}
答案 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)