Нажатие кнопки на пользовательской клавиатуре приводит к «Неопознанному селектору, посылаемому к ошибке экземпляра» - PullRequest
0 голосов
/ 03 января 2012

Я знаю, что есть много других вопросов, касающихся этой проблемы, но, поскольку я использую собственную клавиатуру, я подумал, что моя проблема будет немного другой.

Это конкретная ошибка:

- [EquationTextField element1Pressed:]: нераспознанный селектор отправлен на экземпляр 0x4b68ee0 2012-01-02 12: 23: 44.630 rowQuiz [20975: 207] Завершение приложения из-за необработанного исключения «NSInvalidArgumentException», причина: '- [EquationTextField element1Pressed:]: нераспознанный селектор, отправленный экземпляру 0x4b68ee0'

У меня есть контроллер представления, quizController. Внутри quizController находится пользовательское представление textField (добавлено через конструктор интерфейса).

При нажатии на textField в качестве клавиатуры появляется другое настраиваемое представление FormulaKeyboard. При нажатии кнопки на клавиатуре вызывается метод element1Pressed: и появляется описанная выше ошибка.

Некоторые другие вопросы говорят о том, что должна быть проблема с счетом сохранения, поэтому я попытался сохранить и выпустить quizController в делегате приложения, что не решило проблему.

Также возможно, что я неправильно подключил что-то в Interface Builder; Для пользовательской клавиатуры владелец файла и главный вид установлены в класс elementKeyboard. Для quizController владельцем файла задано значение 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 {


}

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];
}

Ответы [ 2 ]

0 голосов
/ 03 января 2012

Действие кнопок клавиатуры указывает на неправильное место. Скорее всего, вы связали их с владельцем файла внутри кончика FormulaKeyboard, когда они должны быть связаны с объектом FormulaKeyboard, который вы создаете внутри кончика.

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

Это вызывается из EquationTextField, поэтому self будет вашим экземпляром EquationTextField. Если вы нацелены на клавиатуру, вот почему вы получаете нераспознанное исключение селектора.

0 голосов
/ 03 января 2012

Здесь происходит то, что метод с именем element1Pressed: отправляется экземпляру EquationTextField.Вам нужно добавить метод в класс, чтобы он работал.Сейчас он отправляет сообщение классу поля, но подходящего метода нет, поэтому он выдает ошибку.

Кроме того, я не могу быть полностью уверен в этом, так как вы не опубликовали полностьюинформация о коде и / или NIB, но, похоже, вы ошибаетесь.Вы должны использовать контроллер представления для обработки всего, а не пользовательский класс текстового поля.Я заметил, что вы не опубликовали код для класса QuizController.Как только вы это сделаете, я могу дать вам больше советов.


РЕДАКТИРОВАТЬ: Теперь, когда вы разместили больше кода, я думаю, что вижу проблему.Вы хотите, чтобы экземпляр FormulaKeyboard получил событие, но вместо этого событие связано с экземпляром EquationTextField.Убедитесь, что вы подключили его к экземпляру FormulaKeyboard.

С другой стороны, кажется, что у вас может вообще не быть экземпляра FormulaKeyboard в NIB.Добавьте NSLog после keyboard = (FormulaKeyboard *)object, чтобы проверить, действительно ли keyboard когда-либо присвоено значение.Если NSLog не срабатывает, проверьте еще раз, что вы действительно добавили экземпляр FormulaKeyboard в NIB.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...