버튼을 만들고 해당 작업을 추가했지만 호출하자마자이 오류가 발생했습니다.
-[NSCFDictionary numberButtonClick:]: unrecognized selector sent to instance
0x3d03ac0 2010-03-16 22:23:58.811
Money[8056:207] *** Terminating app
due to uncaught exception
'NSInvalidArgumentException', reason:'*** -[NSCFDictionary numberButtonClick:]: unrecognized selector sent to instance 0x3d03ac0'
이것은 내 코드입니다.
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
UIButton *numberButton = [UIButton buttonWithType:UIButtonTypeCustom];
numberButton.frame = CGRectMake(10, 435, 46, 38);
[numberButton setImage:[UIImage imageNamed:@"one.png"] forState:UIControlStateNormal];
[numberButton addTarget:self action:@selector(numberButtonClick:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview: numberButton];
}
return self;
}
-(IBAction)numberButtonClick:(id)sender{
NSLog(@"---");
}
답변
뷰 컨트롤러를 올바르게 관리하는 메모리가 아니며 어느 시점에서 할당이 해제되는 것처럼 보입니다. 이는 numberButtonClicked:
뷰 컨트롤러가 이전에 차지했던 메모리를 차지하는 다른 객체로 메소드가 전송되도록합니다 …
뷰 컨트롤러를 올바르게 유지 / 해제해야합니다.
답변
내가했던 것처럼 Google을 통해 여기에 오는 사람들에게는 아마도 ARC의 Xcode 4.2 + / iOS 5 이상에 더 관련이 있습니다. ” 인식 할 수없는 선택기가 인스턴스로 전송되었습니다 “와 동일한 오류가 발생했습니다 . 필자의 경우 UIButton의 대상 작업을 발신자 매개 변수로 전달하도록 설정했지만 나중에 필요하지 않고 코드에서 제거했습니다. 따라서 다음과 같은 것이 있습니다.
- (IBAction)buttonPressed:(UIButton *)sender {
로 변경되었습니다 :
- (IBAction)buttonPressed {
문제의 UIButton을 마우스 오른쪽 버튼으로 클릭하면 Touch Up Inside 이벤트가 뷰 컨트롤러 buttonPressed : 메서드와 관련이 있음을 보여주었습니다. 이것을 제거하고 수정 된 메소드에 다시 할당하면 대우를했습니다.
답변
이것은이 문제에 대한 Google의 최고 답변이지만 다른 원인 / 결과가있었습니다. 다른 사람들 이이 문제를 우연히 발견 할 경우 2 센트를 더할 것이라고 생각했습니다.
오늘 아침에 비슷한 문제가 발생했습니다. 문제를 제공하는 UI 항목을 마우스 오른쪽 버튼으로 클릭하면 어떤 연결이 생성되었는지 확인할 수 있습니다. 제 경우에는 두 가지 동작으로 연결된 버튼이 있습니다. 마우스 오른쪽 버튼 클릭 메뉴에서 작업을 삭제하고 다시 연결하여 문제를 해결했습니다.
따라서 작업이 올바르게 연결되어 있는지 확인하십시오.
답변
좋아, 나는 여기에 칩을 넣어야한다. OP 는 버튼을 동적으로 만들었습니다 . 나는 비슷한 문제를 겪었고 대답 (헌팅 시간 후)이 너무 단순하여 나를 아프게했습니다.
사용할 때:
action:@selector(xxxButtonClick:)
or (as in my case)
action:NSSelectorFromString([[NSString alloc] initWithFormat:@"%@BtnTui:", name.lowercaseString])
문자열 끝에 콜론을 넣으면 발신자가 전달됩니다. 문자열의 끝에 콜론을 배치하지 않으면 콜론이 발생하지 않으며 수신자는 콜론을 예상 할 경우 오류가 발생합니다. 이벤트 이름을 동적으로 작성하는 경우 콜론을 놓치기 쉽습니다.
수신자 코드 옵션은 다음과 같습니다.
- (void)doneBtnTui:(id)sender {
NSLog(@"Done Button - with sender");
}
or
- (void)doneBtnTui {
NSLog(@"Done Button - no sender");
}
평소와 같이 항상 놓치는 것은 분명한 대답입니다.
답변
필자의 경우 함수는 인수를 기대하지 않았지만 버튼은 오류를 발생시키는 버튼을 보내도록 구성되었습니다. 이 문제를 해결하려면 이벤트 처리기를 다시 연결해야했습니다.
내 기능은 다음과 같습니다.
인수가 포함되어 있지 않습니다.
내 버튼 구성 이미지는 다음과 같습니다 (버튼을 마우스 오른쪽 버튼으로 클릭하면 볼 수 있음).
3 개의 이벤트 핸들러가 있습니다.
이 문제를 해결하려면 각 이벤트 항목 중 하나가 enterPressed 함수에 대한 참조를 전송했기 때문에 각 이벤트 항목을 제거해야했습니다. 이 항목을 제거하려면 항목이 표시되지 않을 때까지 각 항목 이름 옆에있는 작은 x 아이콘을 클릭했습니다.
다음으로 버튼을 이벤트에 다시 연결해야했습니다. 이렇게하려면 Control 키를 누른 상태에서 단추에서 동작으로 선을 드래그하십시오. “연결 작업”이라고 표시되어야합니다. 참고 : 어떤 이유로 든 XCode를 다시 시작해야했습니다. 그렇지 않으면 함수 위 또는 아래에 액션 (일명 새 액션 만들기)을 삽입 할 수 있습니다.
이제 인수가없는 버튼 이벤트에 연결된 단일 이벤트 핸들러가 있어야합니다.
이 답변은 @Leonard Challis의 답변을 칭찬합니다.
답변
인터페이스 빌더에서보기의 “클래스”를 설정하지 않은 경우에도 발생할 수 있습니다.
답변
필자의 경우 NSNotificationCenter를 사용하고 인수는 없지만 콜론을 추가하는 선택기를 사용하려고했습니다. 콜론을 제거하면 문제가 해결되었습니다.
선택기 이름을 사용할 때 인수가 없으면 후미 콜론을 사용하지 마십시오. 하나의 인수가 있으면 하나의 후행 콜론을 사용하십시오. 인수가 둘 이상인 경우 각 인수마다 후행 콜론과 함께 이름을 지정해야합니다.
Adam Rosenfield의 답변을 참조하십시오 : Objective-C의 선택기?