2012-01-02 8 views
0

同じ問題を解決するために他にも多くの質問がありますが、私はカスタムキーボードを使用しているので、少し違う。カスタムキーボードのボタンを押すと「認識できないセレクタがインスタンスエラーに送信されます」

これは、特定のエラーである:

- [EquationTextField element1Pressed:]:23:44.630 rowQuizを[20975:207]認識されないセレクター 2012-01-02 12インスタンス0x4b68ee0に送信アプリの終了によりキャッチされないと例外 'NSInvalidArgumentException'、理由: ' - [EquationTextField element1Pressed:]:インスタンスに送信された認識できないセレクタ0x4b68ee0'

私はビューコントローラ、quizControllerを持っています。 quizControllerの内部は、カスタムビューのtextField(インターフェースビルダーを介して追加された)です。

textFieldをタップすると、別のカスタムビューのformulaKeyboardがキーボードとしてポップアップします。キーボードのボタンを押すと、方法element1Pressed:が呼び出され、上記のエラーが表示されます。

残数に問題があると言われているので、問題を解決しなかったアプリケーションデリゲートにquizControllerを保持して解放しようとしました。

Interface Builderで間違ったものを作成した可能性もあります。カスタムキーボードの場合、Fileの所有者とメインビューはclassKeyKeyクラスに設定されます。 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

ここで何が起こっている

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オブジェクトに配線しなければならない場合、おそらくそれらはFormulaKeyboardペン先のFile's Ownerに配線されているはずです。 EquationTextFieldから呼び出されています

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

、そうself EquationTextFieldのインスタンスになります。キーボードのターゲットがそこを指している場合、そのために認識できないセレクタ例外が発生します。

+0

"は、ペン先の中に作成しているFormulaKeyboardオブジェクトに配線する必要があります。私はあなたがviewControllerのペン先を意味すると仮定しています。キーボードは 'equationTextfield.inputView = keyboard'からそれ自身で表示されるので、私はvcのペン先にFormulaKeyboardオブジェクトを持っていません – Mahir

+0

私はプログラムでやってみましたが、エラーが発生しました。私がしたことは、キーボードのペン先のキーボードのボタンのIBOutletsを追加してから、式テクスチャの中に '[keyboard.button1 addTarget:self action:@selector(element1Pressed :) forControlEvents:UIControlEventTouchDown]; ' – Mahir

+0

、NSArray * bundle = [[NSBundle mainBundle] loadNibNamed:@" FormulaKeyboard "オーナー:self options:nil];' – Mahir

0

element1Pressed:と呼ばれる方法がEquationTextFieldのインスタンスに送信されています。クラスを実際に動作させるには、クラスにメソッドを実際に追加する必要があります。今、フィールドクラスにメッセージを送信していますが、一致するメソッドがないため、エラーが発生しています。

また、完全なコードやNIB情報を投稿していないので、これについては完全にはわかりませんが、間違った方法で行っているようです。カスタムテキストフィールドクラスではなく、すべてを処理するにはビューコントローラを使用する必要があります。 QuizControllerクラスのコードを投稿していないことがわかりました。一度そうすれば、私はあなたにもっとアドバイスを与えることができるかもしれません。


EDIT:今、あなたはより多くのコードを掲載しましたことを、私は問題を参照してくださいと思います。FormulaKeyboardインスタンスでイベントを受信したいが、そのイベントはEquationTextFieldインスタンスにリンクされています。代わりにFormulaKeyboardのインスタンスに配線してください。

一方、NIBにはFormulaKeyboardのインスタンスがないようです。もしに実際に値が割り当てられているかどうかをテストするためにkeyboard = (FormulaKeyboard *)objectの後にNSLogを追加してください。 NSLogが起動しない場合は、実際にFormulaKeyboardのインスタンスをNIBに追加したことを再度確認してください。

+0

もっとコードを追加しました。私はまだビューコントローラに何も追加していません – Mahir

+0

私は情報をあるビューから別のビューに直接渡している理由は、テキストフィールドとキーボードがプロトコル ''で通信するということです。このプロトコルは基本的に ' 'もキーボードと別のビューの間で情報を直接渡します。 – Mahir

+0

@MahirE:自分の投稿を更新しました。 –

関連する問題