UITextField子类在becomeFirstResponder上抛出奇怪的异常

时间:2012-09-04 11:11:15

标签: ios exception uitextfield uiresponder

我有由我的UINavigatableTextField构成的字符框。在每次输入之后,响应者角色应该成功继承它。奇怪的是,在输入第一个字符时,如果用户每次输入字符'Q',则会出现不同的异常;

  • EXC_BAD_ACCESS或
  • 2012-09-04 14:42:42.600 Kelime Oyunu [6350:707] - [WebScriptObjectPrivate isForShortcutConversion]:无法识别的选择器发送到实例0x21b870 2012-09-04 14:42:42.606 Kelime Oyunu [6350:707] * 由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:' - [WebScriptObjectPrivate isForShortcutConversion]:无法识别的选择器发送到实例0x21b870 “

被抛出。我的代码接收下面的例外,[next nextFirstResponder]行

- (void) moveToNextCharacter: (MBNavigatableTextField *) character
{
    dispatch_async(dispatch_get_current_queue(),
               ^{
                   UIControl *next = [character nextField];

                   if(next == nil)
                   {
                       [character endEditing:YES];
                   }
                   else if ([next isKindOfClass:[UIButton class]])
                   {
                       [next sendActionsForControlEvents: UIControlEventTouchUpInside];
                   }
                   else
                   {
                       [next becomeFirstResponder];
                   }
                });
}

我该如何解决这个问题?提前谢谢。

编辑1:找到一个僵尸[下一个resignFirstResponder](感谢@PhillipMills)

编辑2:事实证明我的问题是由

引起的
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    // Something done here...

    // code block of evil zombie summoner
    [textField setText:@"Some text"];

    // Something else done here
}

Profile-> Instruments-> Zombies声明在setText期间:某个对象被释放(我猜是以前的字符串)。

我仍然无法解决问题。我的目标是使用新的用户输入(replacementString:)更新上面的textField。

1 个答案:

答案 0 :(得分:0)

必须在主队列上完成对UIKit对象的所有消息传递。虽然情况可能如此,但声明如下:

dispatch_async(dispatch_get_current_queue()

很麻烦,因为我们不知道你收到消息的队列。将其更改为:

dispatch_async(dispatch_get_main_queue()

所以它绝对清楚。

另外,在这一行下:

UIControl *next = [character nextField];

添加以下声明:

NSLog(@"Character CLASS %@", NSStringFromClass[character class]);
NSLog(@"next CLASS %@", NSStringFromClass[next class]);

确保这些是您认为应该的。

编辑:关于“unsafe_unretained”的使用:如果IBOutlet包含在“self.view”中 - 这是主要视图 - 那么你应该在iOS上使用弱 - 所以当你视图消失了。

关于'shouldChangeCharactersInRange',如果只是查看字符,则返回YES。如果您更改文本本身 - 通过直接写入字段/视图,然后返回NO。如果您修改文本然后返回YES,那么您实际上是在改变控件背后的数据,谁知道后果。