我知道还有很多其他问题可以解决同样的问题,但由于我使用的是自定义键盘,我认为我的问题会略有不同。
这是具体的错误:
- [EquationTextField element1Pressed:]:无法识别的选择器发送到实例0x4b68ee0 2012-01-02 12:23:44.630 rowQuiz [20975:207]由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:' - [EquationTextField element1Pressed:]:无法识别的选择器发送到实例0x4b68ee0'
我有一个视图控制器,quizController。里面的quizController是一个自定义视图textField(通过界面构建器添加)。
点击textField时,会弹出另一个自定义视图formulaKeyboard作为其键盘。按下键盘上的按钮时,将调用方法element1Pressed:
,并显示上述错误。
其他一些问题表明保留计数一定存在问题,所以我尝试在app委托中保留并释放quizController,但这并没有解决问题。
我也可能在Interface Builder中错误地连接了一些东西;对于自定义键盘,File的所有者和主视图设置为class 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 {
}
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 :(得分:0)
这里发生的是一个名为element1Pressed:
的方法被发送到EquationTextField
的实例。您需要将该方法实际添加到类中才能使其正常工作。现在,它正在将消息发送到字段类,但是没有匹配方法,所以它会抛出错误。
另外,我不能完全确定这一点,因为你还没有发布整个代码和/或NIB信息,但似乎你可能会以错误的方式解决这个问题。您应该使用视图控制器来处理所有内容,而不是自定义文本字段类。我注意到您尚未发布QuizController
课程的任何代码。一旦你这样做,我可能会给你更多的建议。
编辑:现在您已经发布了更多代码,我想我已经看到了问题。您希望FormulaKeyboard
实例接收事件,但事件已链接到EquationTextField
实例。请确保将其连接到FormulaKeyboard
的实例。
另一方面,似乎你可能在NIB中没有FormulaKeyboard
的实例。在NSLog
之后添加keyboard = (FormulaKeyboard *)object
,以测试keyboard
是否实际分配了值。如果NSLog
未激活,请仔细检查您是否已将FormulaKeyboard
的实例添加到NIB。
答案 1 :(得分:0)
键盘按钮的动作指向错误的位置。您可能已将它们连接到FormulaKeyboard nib内的File's Owner,它们应连接到您在nib内创建的FormulaKeyboard对象。
NSArray *bundle = [[NSBundle mainBundle] loadNibNamed:@"FormulaKeyboard" owner:self options:nil];
这是从EquationTextField调用的,因此self
将是您的EquationTextField实例。如果你的键盘目标指向那里,那就是你得到无法识别的选择器异常的原因。