2017-11-30 19 views
0

코드 완성은 #selector( 내부의 메소드 이름을 채운 다음 런타임에 선택기를 인식 할 수 없다는 오류 (IllegalArgumentException)로 인해 충돌이 발생합니다.Xcode9/Swift4에서도 UnrecognizedSelector가 어떻게 가능합니까?

선택자 구문을 더 이상 단순한 문자열로 다시 작성하는 요령은 무엇입니까 ?? 여기

은 선택의 창조 :

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { 
다음의 tableview의 헤더 섹션 (여기 참조)

headerAddButton.addTarget(section, action: #selector(addActivityToSpecificDay(sender:)), for: .touchDown) 

섹션 (이 코드는 엑스 코드 (9) 전에 일하고 언급하는 것을 잊었다) (C)의 같은 소스 파일

@objc func addActivityToSpecificDay (sender :UIButton) 

: 여기

는 방법 핸들러의 서명 인 ourse. 그러나 질문을 읽으십시오. 코드 완성을 통해 지구에서 어떻게 런타임 충돌이 발생 하는지를 알 수 있습니까?

+0

당신의 메소드는'@objc' 태그가 붙은 메소드를 오버라이드하거나'@ objc' 프로토콜의 요구 사항을 만족시키는'@ objc' 태그가 붙어 있습니까? – vacawama

+1

코드를 보여주십시오. – creeperspeak

+0

예 그것은 @objc를 가지고있다. – Rob

답변

3

은 당신과 같이 대상을 추가 :

headerAddButton.addTarget(section, action: #selector(addActivityToSpecificDay(sender:)), for: .touchDown) 

당신의 #selector 클래스와 addActivityToSpecificDay을 충족하지 못하는, 그것은 분명, 현재 클래스에서 그 이름의 몇 가지 방법와 일치되어하지에 있기 때문에 어떤 클래스 section입니다.

두 가지 옵션이 있습니다 : section는 (그림의 목적을 위해,의 그것 SectionClass이었다 가정 해 봅시다) 무엇이든 클래스에

  1. 이동 addActivityToSpecificDay 참조 당신의 #selector 클래스 :

    headerAddButton.addTarget(section, action: #selector(SectionClass.addActivityToSpecificDay(sender:)), for: .touchDown) 
    
  2. 또는 addActivityToSpecificDay을 현재 클래스로 유지하고 addTarget의 대상을 self :

    로 변경하십시오.
    headerAddButton.addTarget(self, action: #selector(addActivityToSpecificDay(sender:)), for: .touchDown) 
    

당신은 질문으로 더 이상 단지 문자열을 선택 구문을 다시 실행하지의 포인트는 무엇

했다?

그것은 선택의 기능이 있고 잘 (아주 좋은 일이다)이 형성되어 있지만 분명히 선택의 클래스가 다른 매개 변수 (이의 target와 같은 클래스 인 것을 일어나는 것을 확인할 수 없음을 확인합니다 예). 컴파일러는 addTarget 메서드에서 선택기를 사용하는 방식이나 두 매개 변수 사이에 특별한 관계가 있음을 안정적으로 알 수 없습니다. 그것은 개발자에게 맡겨져 있습니다. #selector 구문이 도움이 되나 마술 총알이 아닙니다.