按下自定义键盘上的按钮导致“无法识别的选择器被发送到实例错误”

时间:2012-01-02 20:37:48

标签: objective-c interface-builder

我知道还有很多其他问题可以解决同样的问题,但由于我使用的是自定义键盘,我认为我的问题会略有不同。

这是具体的错误:

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

2 个答案:

答案 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实例。如果你的键盘目标指向那里,那就是你得到无法识别的选择器异常的原因。