我有这个代码在UIPopover中创建40个UITextFields;当我尝试在其中一个textField中放一个数字时,应用程序会崩溃:
- [ImportTABDelimitedFile respondsToSelector:]:发送到解除分配的实例的消息
这是创建文本字段的代码:
// create the uitextfields for user to match against their input file columns
CGRect nbrFieldRect = CGRectMake(x-20, y, 26.0f, 26.0f);
UITextField *nbrTextField = [[UITextField alloc] initWithFrame:nbrFieldRect];
if(colorYES)
nbrTextField.backgroundColor = UIColorFromRGB(0xFFF9AF);
else
nbrTextField.backgroundColor = [UIColor whiteColor];
nbrTextField.enabled = YES;
[nbrTextField setKeyboardType:UIKeyboardTypeNumberPad];
nbrTextField.textColor = [UIColor blackColor];
nbrTextField.tag = tagNumber + 100; // range: 170-215
nbrTextField.font = [UIFont systemFontOfSize:12.0f];
nbrTextField.borderStyle = UITextBorderStyleRoundedRect;
nbrTextField.returnKeyType = UIReturnKeyNext;
nbrTextField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
[nbrTextField addTarget:self action:@selector(mapUserFields) forControlEvents: UIControlEventEditingDidEnd];
nbrTextField.delegate = self;
[theView addSubview:nbrTextField];
这是 mapUserFields 的代码:
-(void)mapUserFields {
NSLog(@"mapUserFields: textFieldDidEndEditing");
}
UPDATE#2 我运行了Instruments,它显示方法正在被释放,导致崩溃;这是仪器输出的图像:
现在,问题是:为什么方法被解除分配,我该如何解决?
答案 0 :(得分:2)
您在创建文本字段时添加委托并设置其他属性,如下所示:
UITextField *nbrTextField = [[UITextField alloc] initWithFrame:nbrFieldRect];
nbrTextField.delegate = self;
并实现其委托方法,当您从键盘输入键时调用该方法:
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
[textField resignFirstResponder];
return YES;
}
您发布的上述代码到目前为止看起来很好,直到您发布崩溃日志。
编辑:您发布的崩溃日志建议添加为ImportTABDelimitedFile
文本字段事件的观察者的对象(在此情况下为UIControlEventEditingDidEnd
)。< / p>
您是否可以通过创建具有保留类型的属性以及将属性集nil
解除为弹出变量来确保您在展示类中保留的一个东西popover。例如:
@property (nonatomic, retain) UIPopoverController *popoverController;
并且不要忘记在弹出窗口时初始化并指定此属性。将其委托设置为自己,如下所示:
popoverController.delegate = self;
不要忘记实现委托,并在委托方法中,清除属性变量,如下所示:
- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController{
self.popoverController = nil; //if you are using non-arc, release it.
}
答案 1 :(得分:1)
我发现了问题(在Michael Dautermann的帮助下)......我不得不将被调用的方法变为如下属性:
iTABFile = [[ImportTABDelimitedFile alloc]init];
现在,它还没有发布,而且像冠军一样!谢谢大家的帮助;对此,我真的非常感激。 SD
答案 2 :(得分:0)
我猜这里没有看到其余的代码,但你需要做两件事。首先,设置创建所有textFields的类以符合UITextFieldDelegate协议。我觉得你粘贴上面代码的课程就是那个。
这是在头文件(.h)
中完成的同样,在创建40多个文本字段时,请设置:
nbrTextField.delegate = self;
将当前类作为UITextFields的委托。
希望这有帮助