2012-01-02 3 views
0

동일한 문제를 해결하는 데 많은 질문이 있지만 사용자 지정 키보드를 사용하고 있기 때문에 문제가 발생할 것이라고 생각했습니다. 약간 다르다.사용자 지정 키보드의 단추를 누르면 "인식 할 수없는 선택기가 인스턴스 오류로 전송 됨"이 발생합니다.

이 특정 오류이다

- [EquationTextField element1Pressed :] : 23 : 44.630 rowQuiz를 [20,975 : 207] 미정 선택기 2012-01-02 12 인스턴스 0x4b68ee0 전송 애플리케이션의 종료로 인해 캐치되지 행 예외 'NSInvalidArgumentException', 이유 : '- [EquationTextField element1Pressed :] : 인스턴스로 전송 된 인식 할 수없는 선택기 0x4b68ee0'

뷰 컨트롤러, quizController가 있습니다. 내부 quizController는 custom view, textField (인터페이스 빌더를 통해 추가됨)입니다.

textField를 누르면 다른 사용자 정의보기 인 formulaKeyboard가 해당 키보드로 팝업됩니다. 키보드의 단추를 누르면 element1Pressed: 메서드가 호출되고 위에서 설명한 오류가 나타납니다.

일부 다른 질문에 보유 개수에 문제가 있다고해서 문제를 해결하지 못했던 응용 프로그램 대리인에서 quizController를 유지하고 해제하려고했습니다.

Interface Builder에서 잘못 처리 한 부분이있을 수도 있습니다. 사용자 정의 키보드의 경우 File의 소유자와 기본보기는 elementKeyboard 클래스로 설정됩니다. quizController의 경우 File의 소유자가 quizController로 설정되고 뷰에 연결됩니다.

아래는 textField 클래스의 코드입니다.

EquationTextField.h

#import <UIKit/UIKit.h> 
#import "FormulaKeyboard.h" 


@interface EquationTextField : UIView <KeyInput> { 

FormulaKeyboard *keyboard; 
NSString *lastElement; 
} 

@property (readwrite, retain) UIView *inputView; 

@end 

EquationTextField.m

- (id)initWithCoder:(NSCoder *)coder { 

self = [super initWithCoder:coder]; 
if (self) { 

    self.userInteractionEnabled = YES; 

    [self addGestureRecognizer: 
    [[UITapGestureRecognizer alloc] initWithTarget:self 
              action:@selector(becomeFirstResponder)]]; 


    NSArray *bundle = [[NSBundle mainBundle] loadNibNamed:@"FormulaKeyboard" owner:self options:nil]; 

    for (id object in bundle) { 
     if ([object isKindOfClass:[FormulaKeyboard class]]) 
      keyboard = (FormulaKeyboard *)object; 
    } 


    self.inputView = keyboard; 
    keyboard.delegate = self; 

} 
return self; 
} 

- (BOOL)canBecomeFirstResponder { 

return YES; 
} 

#pragma mark -- KeyInput Protocol Methods 

- (void)addElement:(NSString *)elementName { 


} 

- (void)addCharge:(NSString *)chargeIncrease { 


} 

- (void) addState:(NSString *)stateName { 

} 

- (void)deleteCharacter { 


} 


- (void)dealloc 
{ 
[super dealloc]; 
} 

formulaKeyboard.h

#import <UIKit/UIKit.h> 


@protocol KeyInput <UITextInputTraits> 

- (void) addElement:(NSString*) elementName; 
- (void) addCharge:(NSString*) chargeIncrease; 
- (void) addState:(NSString*) stateName; 
- (void) deleteCharacter; 

@end 

@interface FormulaKeyboard : UIView { 

id <KeyInput> delegate; 
} 

@property (nonatomic, retain) id <KeyInput> delegate; 


-(IBAction) element1Pressed:(id)sender; 
-(IBAction) element2Pressed:(id)sender; 
-(IBAction) element3Pressed:(id)sender; 
-(IBAction) element4Pressed:(id)sender; 
-(IBAction) element5Pressed:(id)sender; 
-(IBAction) element6Pressed:(id)sender; 

-(IBAction) chargePlusPressed:(id)sender; 
-(IBAction) chargeMinusPressed:(id)sender; 

-(IBAction) solidSatePressed:(id)sender; 
-(IBAction) liquidStatePressed:(id)sender; 
-(IBAction) gasStatePressed:(id)sender; 



@end 

formulaKeyboard.m

- (IBAction)element1Pressed:(id)sender { 

[delegate addElement:@"Na"]; 

} 

- (void)element2Pressed:(id)sender { 

[delegate addElement:@"N"]; 


} 

- (void)element3Pressed:(id)sender { 

[delegate addElement:@"O"]; 


} 

- (void)element4Pressed:(id)sender { 


} 

- (void)element5Pressed:(id)sender { 



} 

- (void)element6Pressed:(id)sender { 


} 
0

appDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 

quizController = [[QuizController alloc] initWithNibName:@"QuizController" bundle:nil]; 
[self.window addSubview:quizController.view]; 
[self.window makeKeyAndVisible]; 
return YES; 
} 

    - (void)dealloc 
{ 
[_window release]; 
[quizController release]; 
[super dealloc]; 
} 
+0

그 모든 EquationTextField의 구현입니까? 'element1Pressed :'메소드를 가지고 있습니까? – MyztikJenz

+0

@MyztikJenz'element1Pressed :'메소드는 FormulaKeyboard의 구현에 있습니다. 위의 코드를 추가했습니다. – Mahir

답변

0

키보드의 버튼이 잘못된 위치를 가리키고 있습니다. 펜촉 안에 작성중인 FormulaKeyboard 객체에 유선을 연결해야 할 때 FileKey Owner의 FormulaKeyboard 펜촉에 유선을 연결했을 것입니다. EquationTextField에서 호출되는 것

NSArray *bundle = [[NSBundle mainBundle] loadNibNamed:@"FormulaKeyboard" owner:self options:nil];

, 그래서 self EquationTextField의 인스턴스가 될 것입니다. 키보드의 타겟이 가리키고있는 경우, 그 이유는 인식 할 수없는 선택기 예외가 발생하기 때문입니다.

+0

"은 펜촉 안에 작성중인 FormulaKeyboard 객체에 연결해야합니다." 나는 당신이 viewController의 코코아를 의미한다고 가정합니다. 키보드가'equationTextfield.inputView = keyboard' 이후로 자체적으로 나타나기 때문에 vc의 펜촉 안에 FormulaKeyboard 객체가 없습니다. – Mahir

+0

프로그래밍 방식으로 시도했지만 오류가 발생했습니다. 내가 한 일은 키보드의 펜촉 안쪽에있는 키보드의 버튼에 IBOutlets를 추가 한 다음 equationTextField 안에'[keyboard.button1 addTarget : self action : @selector (element1Pressed :) forControlEvents : UIControlEventTouchDown]; ' – Mahir

+0

그리고 NSArray * 번들 = [[NSBundle mainBundle] loadNibNamed : @ "FormulaKeyboard"소유자 : 자체 옵션 : nil]에 대한 오류가 발생했습니다. – Mahir

0

은 여기에서 일어나고있는 것은 element1Pressed:라는 방법 EquationTextField의 인스턴스로 전송되고있다. 클래스가 실제로 작동하려면 클래스에 메소드를 실제로 추가해야합니다. 지금은 필드 클래스에 메시지를 보내고 있지만 일치하는 메서드가 없으므로 오류가 발생합니다.

또한 전체 코드 및/또는 NIB 정보를 게시하지 않았으므로 이것에 대해 완전히 확신 할 수는 없지만 잘못된 방식으로 진행될 수 있습니다. 사용자 정의 텍스트 필드 클래스가 아닌 모든 것을 처리하려면보기 컨트롤러를 사용해야합니다. QuizController 클래스에 대한 코드를 게시하지 않았습니다. 일단 그렇게하면 더 많은 조언을 드릴 수 있습니다.


편집 : 지금 당신이 더 많은 코드를 게시 한 것으로, 나는이 문제를 볼 생각합니다.FormulaKeyboard 인스턴스가 이벤트를 수신하려고하지만 이벤트가 EquationTextField 인스턴스에 대신 연결되기를 원합니다. 대신 FormulaKeyboard의 인스턴스에 연결해야합니다.

한편 NIB에는 FormulaKeyboard의 인스턴스가 없을 수도 있습니다. 에 실제로 값이 할당되었는지 테스트하려면 keyboard = (FormulaKeyboard *)object 뒤에 NSLog을 추가하십시오. NSLog이 실행되지 않으면 실제로 NIB에 FormulaKeyboard의 인스턴스를 추가했는지 다시 확인하십시오.

+0

코드를 추가했습니다. 아직 뷰 컨트롤러에 아무 것도 추가하지 않았습니다. – Mahir

+0

정보를 한 뷰에서 다른 뷰로 직접 전달하는 이유는 텍스트 필드와 키보드가 프로토콜 ''을 통해 통신한다는 것입니다.이 프로토콜은 기본적으로' '또한 키보드와 다른보기간에 직접 정보를 전달합니다. – Mahir

+0

@MahirE : 내 게시물을 업데이트했습니다. –

관련 문제