'#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) }