Я знаю, что есть много других вопросов, касающихся этой проблемы, но, поскольку я использую собственную клавиатуру, я подумал, что моя проблема будет немного другой.
Это конкретная ошибка:
- [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];
}