문제

버튼을 만들고 액션을 추가했지만 호출 하자마자이 오류가 발생했습니다.

-[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을 통해 여기에 도착하는 사람들에게는 아마도 Xcode 4.2+/iOS 5+ 더 많은 것, ARC와 관련이있을 것입니다. 나는 같은 오류가 있었다 "인식되지 않은 선택기가 인스턴스로 전송됩니다". 제 경우에는 Uibutton의 대상 조치가 발신자 매개 변수로 전달되도록 설정했지만 나중에는 필요하지 않다는 것을 깨달았고 코드에서 제거했습니다. 따라서 다음과 같은 것입니다.

- (IBAction)buttonPressed:(UIButton *)sender {

변경되었습니다 :

- (IBAction)buttonPressed {

문제의 Uibutton을 마우스 오른쪽 버튼으로 클릭하면 Touch Up Inside Event가 View Controllers ButtonPressed : Method와 관련이 있음을 보여주었습니다. 이것을 제거하고 수정 된 방법에 그것을 재 할당하는 것은 치료를 받았다.

이것은이 문제에 대한 최고의 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");
}

평소와 같이, 그것은 항상 놓친 명백한 대답입니다.

제 경우에는 기능이 인수를 기대하지 않았지만 버튼은 오류를 일으키는 하나를 보내도록 구성되었습니다. 이 문제를 해결하기 위해 이벤트 핸들러를 다시 사용해야했습니다.

내 기능은 다음과 같습니다.

enter image description here

논쟁이 포함되어 있지 않습니다.

다음은 내 버튼 구성 이미지입니다 (보기를 보려면 버튼을 마우스 오른쪽 버튼으로 클릭하십시오).

enter image description here

3 개의 이벤트 처리기가 있습니다.

이를 해결하기 위해 각 이벤트 항목이 각 이벤트 항목을 제거해야했습니다. 그 중 하나가 Enterpressed 기능에 대한 참조를 보내었기 때문입니다. 이 항목을 제거하려면 항목이 표시되지 않을 때까지 각 항목의 이름 옆에있는 작은 X 아이콘을 클릭했습니다.

enter image description here

다음으로 버튼을 이벤트에 다시 연결해야했습니다. 이 작업을 수행하려면 제어 키를 누른 다음 버튼에서 동작으로 라인을 드래그하십시오. "작업 연결"이라고 말해야합니다. 참고 : 어떤 이유로 Xcode를 다시 시작해야했습니다. 그렇지 않으면 함수 위 또는 아래에 동작 (일명 새 동작 생성) 만 삽입 할 수 있습니다.

enter image description here

이제 단일 이벤트 핸들러가 버튼 이벤트에 연결되어 있어야합니다.

enter image description here

이 답변은 @leonard challis의 답변을 읽어야합니다.

인터페이스 빌더에서보기의 "클래스"를 설정하지 않으면 이런 일이 발생할 수 있습니다.

제 경우에는 nsnotificationCenter를 사용하고 있었고 논쟁을 취하지 않았지만 결장을 추가하는 선택기를 사용하려고 시도했습니다. 결장을 제거하면 문제가 해결되었습니다.

선택기 이름을 사용할 때는 인수가없는 경우 후행 콜론을 사용하지 마십시오. 하나의 주장이있는 경우 하나의 후행 콜론을 사용하십시오. 하나 이상의 주장이있는 경우, 각 인수에 대해 후행 콜론과 함께 이름을 지정해야합니다.

Adam Rosenfield의 답변을 참조하십시오. Objective-C의 선택기?

버튼을 동적으로 만들어내는 신속한 프로젝트 에서이 문제가있었습니다. 문제 코드 :

var trashBarButtonItem: UIBarButtonItem {
    return UIBarButtonItem(barButtonSystemItem: .Add, target: self, action: "newButtonClicked")
}

func newButtonClicked(barButtonItem: UIBarButtonItem) {
    NSLog("A bar button item on the default toolbar was clicked: \(barButtonItem).")
}

해결책은 전체 결장을 추가하는 것이 었습니다. ':'행동 후 : 예 :

var trashBarButtonItem: UIBarButtonItem {
        return UIBarButtonItem(barButtonSystemItem: .Add, target: self, action: "newButtonClicked:")
    }

    func newButtonClicked(barButtonItem: UIBarButtonItem) {
        NSLog("A bar button item on the default toolbar was clicked: \(barButtonItem).")
    }

여기에 전체 예 : https://developer.apple.com/library/content/samplecode/uicatalog/listings/swift_uikitcatalog_defaulttoolbarviewcontroller_swift.html

이것의 가장 명백한 원인 (완전성 포함)은 포인터를 부적절하게 던지고 잘못된 클래스의 방법을 부르는 것입니다.

NSArray* array = [[NSArray alloc] init];
[(NSDictionary*)array objectForKey: key]; // array is not a dictionary, hence exception

나는 비슷한 문제가 있었지만 나에게는 해결책이 약간 달랐습니다. 필자의 경우 카테고리를 사용하여 기존 클래스를 확장했습니다 (일부 크기 조정 기능을위한 UIIMAGE-이 참조 어떻게 관심이있는 경우) *.m 파일을 빌드 대상에 추가하는 것을 잊었습니다. 어리석은 오류이지만 어디에서보아야하는지 항상 분명하지는 않습니다. 공유 할 가치가 있다고 생각했습니다 ...

나는 같은 오류가 있었고 다음을 발견했습니다.

코드를 사용할 때

[self.refreshControl addTarget:self action:@selector(yourRefreshMethod:) forControlEvents:UIControlEventValueChanged];

선택기를 찾고 있다고 생각할 수도 있습니다.

- (void)yourRefreshMethod{
    (your code here)
}

그러나 실제로 선택기를 찾고 있습니다.

- (void)yourRefreshMethod:(id)sender{
    (your code here)
}

해당 선택기는 존재하지 않으므로 충돌이 발생합니다.

오류를 해결하기 위해 선택기를 수신하도록 (ID) 발신자를 변경할 수 있습니다.

하지만 새로 고침 기능을 호출하는 다른 기능이 있다면 어떨까요? 없이 발신자를 제공 하시겠습니까? 둘 다에 맞는 한 가지 기능이 필요합니다. 쉬운 솔루션은 다른 기능을 추가하는 것입니다.

- (void)yourRefreshMethodWithSender:(id)sender{
    [self yourRefreshMethod];
}

그런 다음 새로 고침 풀다운 코드를 수정하여 대신 해당 선택기를 호출하십시오.

[self.refreshControl addTarget:self action:@selector(yourRefreshMethodWithSender:) forControlEvents:UIControlEventValueChanged];

또한 최신 버전의 Mac OSX로 업그레이드 할 수없는 구형 MAC에서 Stanford iOS 코스를하고 있습니다. 그래서 나는 여전히 iOS 6.1을 위해 건물을 짓고 있으며, 이것은 나에게 문제를 해결했습니다.

나는 또한 같은 문제가있었습니다.

나는 내 스토리 보드에서 Uibutton을 삭제하고 그것을 재현했습니다. 이제 모든 것이 잘 작동합니다.

우연히 UIViewController 클래스 코드 내부에서 "@ibaction func ..."을 지우기 때문에 스토리 보드에 참조 콘센트가 만들어졌지만 런타임에 처리 할 함수가있었습니다.

솔루션은 속성 검사관 내부의 아울렛 참조를 삭제 한 다음 명령 키로 클래스 코드에 드래그하는 것을 재현하는 것이 었습니다.

도움이되기를 바랍니다!

반환 유형의 iBaction 대신 공극을 사용해야한다고 생각합니다. 프로그래밍 방식으로 버튼을 정의했기 때문입니다.

또 다른 가능한 해결책 : 링커 인수에 '-objc'를 추가하십시오.

전체 설명이 여기에 있습니다. 정적 라이브러리의 목적 C 범주

요점은 다음과 같습니다. 범주가 정적으로 연결되는 라이브러리에 정의되면 링커는 카테고리 메소드에서 링크하기에 충분히 스마트하지 않습니다. 위의 플래그는 모든 목표 C 클래스와 카테고리에서 링커 링크를 만듭니다. 생각합니다 소스 분석을 기반으로해야합니다. (그 대답을 자유롭게 조정하거나 수정하십시오. 나는 링크 된 언어에 대해 알고 있으므로 여기서 앵무새를하고 있습니다).

저는 현재 iOS 개발을 배우고 Apress의 "IOS6 개발 시작"책을 살펴보고 있습니다. 10 장 : 스토리 보드에서 같은 오류가 발생했습니다.

그것을 알아내는 데 이틀이 걸렸지 만 실수로 테이블 뷰 셀의 태그를 가지고 있지 않아야 할 때 1로 설정했습니다. 이 책을하는 다른 사람에게는 비슷한 오류를받습니다. 이것이 도움이되기를 바랍니다.

내 코드의 미래 오류가 더 쉽게 찾을 수 있기를 바랍니다! 하하하. 디버그 오류는 그것을 알아 내기 위해 올바른 방향으로 나를 밀어 붙일 수 없었습니다 (또는 적어도 디버거를 이해하기에는 너무 새로워요).

제 경우에는 UIWebView를 사용하고 있었고 NSURL 대신 두 번째 매개 변수에서 NSString을 통과했습니다. 따라서 잘못된 클래스 유형이 함수로 전달되면이 오류가 발생할 수 있다고 생각합니다.

.. 그리고 지금 내

버튼이 다른 버튼의 매개 변수에 액세스하고 훌륭하게 작동하는 방법에 링크되었지만 버튼 자체로 무언가를하려고하자마자 충돌이 발생했습니다. 컴파일하는 동안 오류가 표시되지 않았습니다. 솔루션?

버튼을 파일의 소유자에게 링크하지 못했습니다. 그래서 여기 누군가가 나만큼 바보라면 이것을 시도하십시오 :)

또 다른 약간 다른 솔루션/케이스.

나는 Xamarin과 MVVMCross를 사용하고 있으며 Uibutton을 뷰 모델에 묶으려고 노력했습니다. 나는 Uibutton이 아울렛과 터치 푸핀 사이드에 연결했습니다.

바인딩 할 때는 배출구 만 사용합니다.

set.Bind (somethingOutlet).For ("TouchUpInside").To(vm => vm.Something);

내가해야 할 일은 Xcode에서 동작 (Touchupinside) 연결을 제거하는 것입니다.

추신 : 나는 이것이 이전 답변과 특히 @chris kaminski와 관련이 있다고 생각하지만, 이것이 누군가를 도울 수 있기를 바랍니다.

건배.

나는 같은 문제가 있었다. 나에게 문제는 하나의 버튼에 두 가지 동작 방법이 있다는 것입니다. 내가 한 일은 내 버튼의 첫 번째 액션 메소드를 작성한 다음 View Controller에서 삭제했지만 Connection Inspector의 기본 스토리 보드에서 연결을 분리하는 것을 잊어 버렸습니다. 따라서 두 번째 조치 방법을 추가했을 때 이제 하나의 버튼에 대한 두 가지 작업 메소드가있어 오류가 발생했습니다.

저에게는 인터페이스 빌더 BIJ Ctrl-Dragging에서 생성 된 남은 연결이었습니다. 깨진 연결의 이름은 오류 로그에있었습니다.

*** Terminating app due to uncaught exception 'NSInvalidArgumentException',
reason: '-[NameOfYourApp.NameOfYourClass nameOfCorruptConnection:]:
unrecognized selector sent to instance 0x7f97a48bb000'

버튼에 연결된 작업이있었습니다. 배출구가 더 이상 내 코드에 존재하지 않기 때문에 버튼을 누르면 앱이 충돌했습니다. 로그에서 이름을 검색하면 스토리 보드에서 저를 만들었습니다. 삭제했고 충돌이 사라졌습니다!

내 경우에는 2 시간 후에 문제를 해결했습니다.

발신자 (Tabbar 항목) 참조 콘센트가 없었습니다. 그래서 그것은 아무데도 가리키고있었습니다.

Juste 참조 콘센트를 만듭니다 기능에 해당합니다.

이것이 당신에게 도움이되기를 바랍니다.

Leonard Challis에게 답장을 보내고 있습니다. 스탠포드 iOS 클래스 C193P를 사용했기 때문에 사용자 "OLI206"과 마찬가지로

"예외로 인한 앱 종료 예외 'nsinvalidargumentexception', 이유 :"

문제는 계산기의 "입력"버튼이 두 번 연결되어 있다는 것이었고, 친구는 스토리 보드의 버튼을 검사하는 것이 오른쪽 클릭을 클릭했을 때 두 개의 항목이 "내부 터치"속성에 있음을 보여 주었다는 것을 지적했습니다. "입력"버튼. "내부의 터치 업"중 하나를 지우는 것은 문제를 해결했습니다.

이는 문제가 트리거되었음을 보여 주었다 (과제 1의 계산기 연습에 대한 C193P 비디오 클래스의 경우) 2 번의 보낸 이벤트가 예외를 일으킨 것으로 나타났습니다.

viewController를 InterfaceBuilder의 ViewControllersCene에 할당하지 않으면 발생할 수 있습니다. 따라서 ViewController.m은 어떤 장면에도 연결되어 있지 않습니다.

내 몫을 포함하여. 나는 프로젝트를 만들었다는 것을 깨달을 때까지 이것에 잠시 멈췄다. 아크 (자동 카운팅 참조) 장애가 있는. 해당 옵션에서 예를 간단히 설정하면 내 문제가 해결되었습니다.

이것의 또 다른 바보 같은 원인은 셀렉터가 인터페이스 (.h)에 정의되지만 구현 (.m) (PE 오타)에 정의되지 않습니다.

목록에 추가 할 또 다른 이유/솔루션. 이것은 iOS6.0 (및/또는 잘못된 프로그래밍)에 의해 발생합니다. 기존 버전에서는 매개 변수 유형이 일치하는 경우 선택기가 일치하지만 iOS 6.0에서는 매개 변수 이름이 올바르지 않은 이전에 작동하는 코드에서 충돌이 발생했습니다.

나는 같은 일을하고 있었다

[objectName methodName:@"somestring" lat:latValue lng:lngValue];

하지만 정의 (.h와 .m)에서 나는

(viod) methodName:(NSString *) latitude:(double)latitude longitude:(double)longitude;

이것은 iOS5에서 잘 작동했지만 6에서는 잘 작동하지 않았으며, 심지어 다른 장치에 배치 된 정확히 동일한 빌드조차도 잘 작동했습니다.

컴파일러 Coud가 왜 이것을 말하지 않는지, 어쨌든 문제가 해결되는 이유를 알지 못합니다.

이것은 또한 Controlera에서 Custom Controllerb 클래스 내부의 공공 속성으로 속성을 설정하고 싶을 때도 발생할 수 있으며 스토리 보드의 Identity Inspector 내부에서 "사용자 정의 클래스"를 설정하지 않았습니다.

내 문제와 해결책은 달랐고 미래의 독자들이 머리를 벽으로 두드리는 것을 막을 수 있도록 여기에 게시해야한다고 생각했습니다.

나는 다른 xib를 동일한 uiviewcontroller에 할당하고 있었고, 어디에서나 검색 한 후에도 그것을 수정하는 방법을 찾을 수 없었습니다. 그런 다음 제가 부르는 곳의 AppDelegate를 확인했습니다 initWithNibName 코드를 복사하는 동안 XIB 이름을 변경했지만 변경을 잊었을 수 있습니다. UIViewController 수업. 따라서 해결책이 귀하에게 적합하지 않으면 귀하의 initWithNibName 방법.

상충되는 제약 논쟁 때문에 나에게 일어났다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top