programing

'#selector'는 Objective-C에 노출되지 않는 방법을 말합니다.

itmemos 2023. 6. 21. 22:22
반응형

'#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 런타임에 노출되지 않습니다.그렇기 때문에 두 가지 변형이 있습니다.

  1. 표시하기private또는fileprivate메서드 선언@objc[정보]
  2. 사용하다internal,public,open메서드 액세스 한정자[About]

언급URL : https://stackoverflow.com/questions/36818083/selector-refers-to-a-method-that-is-not-exposed-to-objective-c

반응형