0

我有由 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 becomeFirstResponder] 行

- (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:找到一个僵尸 [next 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。

4

1 回答 1

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,那么您实质上是在更改控件背后的数据,谁知道会产生什么后果。

于 2012-09-04T13:09:09.453 回答