'#selector'는 Objective-C에 노출되지 않는 방법을 말합니다.
addTarget을 통해 매개 변수를 전달하는 새로운 Xcode 7.3은 일반적으로 나에게 작동하지만 이 경우에는 제목에 오류를 던지고 있습니다.아이디어 있어요?@objc로 변경하려고 하면 또 다른 메시지가 나타납니다.
감사해요!
cell.commentButton.addTarget(self, action: #selector(FeedViewController.didTapCommentButton(_:)), forControlEvents: UIControlEvents.TouchUpInside)
호출하는 선택자
func didTapCommentButton(post: Post) {
}
내 경우 선택기의 기능은private일단 제가 그것을 제거했을 때private오류가 사라졌습니다.그것도 마찬가지입니다.fileprivate.
인 스위프트 4
추가해야 합니다.@objc함수 선언으로 이동합니다.swift 4까지 이것은 암묵적으로 추론되었습니다.
다음을 사용해야 합니다.@objc에 대한 귀책.didTapCommentButton(_:)와 함께 사용하기 위해#selector.
당신은 그것을 했다고 말하지만 또 다른 오류가 발생했습니다.제 추측으로는 새로운 오류는Post는 Objective-C와 호환되는 유형이 아닙니다.메서드의 모든 인수 유형 및 반환 유형이 Objective-C와 호환되는 경우에만 메서드를 Objective-C에 노출할 수 있습니다.
당신은 그것을 만들 수 있습니다.Post의 하위 분류.NSObject하지만 그것은 중요하지 않을 것이다, 왜냐하면 그 주장은.didTapCommentButton(_:)아닐 것입니다.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그리고 그것으로부터 게시물을 얻습니다.
@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
}
선택기가 래퍼 함수를 가리키도록 하여 대리자 함수를 호출합니다.그것은 저에게 효과가 있었습니다.
cell.commentButton.addTarget(self, action: #selector(wrapperForDidTapCommentButton(_:)), forControlEvents: UIControlEvents.TouchUpInside)
-
func wrapperForDidTapCommentButton(post: Post) {
FeedViewController.didTapCommentButton(post)
}
당신이 알다시피.selector[About] 그렇다고 합니다Objective-C runtime[About] 사용해야 합니다.다음과 같이 표시된 선언문private또는fileprivate는 기본적으로 Objective-C 런타임에 노출되지 않습니다.그렇기 때문에 두 가지 변형이 있습니다.
언급URL : https://stackoverflow.com/questions/36818083/selector-refers-to-a-method-that-is-not-exposed-to-objective-c
'programing' 카테고리의 다른 글
| 병합 사용 중...source.id 과 target.id 사이의 매핑을 가져오는 출력 (0) | 2023.06.21 |
|---|---|
| TSQL에서 증분 날짜의 결과 집합 생성 (0) | 2023.06.21 |
| 파이썬 함수 호출에서 stdout 출력을 캡처하는 방법은 무엇입니까? (0) | 2023.06.21 |
| 영업일(예: 주말 무시)만 고려하여 날짜에 일 수를 추가하는 방법은 무엇입니까? (0) | 2023.06.21 |
| 사용자 지정 SSH 포트에서 Git (0) | 2023.06.21 |