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: ゾンビが見つかりました [次の rejectFirstResponder] (@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 中にいくつかのオブジェクトが解放されることを示しています (これは前の文字列だと思います)。

私はまだ問題を解決できません。私の目標は、上記の textField を新しいユーザー入力 (replacementString:) で更新することです。

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ではweakを使用する必要があります。そのため、ビューが消えたときに無効になります。 。

'shouldChangeCharactersInRange'に関して、単に文字を見ているだけの場合は、YESを返します。テキスト自体を変更する場合-フィールド/ビューに直接書き込むことにより、NOを返します。テキストを変更してからYESを返すと、本質的に、コントロールの背後にあるデータを変更し、誰がどのような結果を知っているかを知ることになります。

于 2012-09-04T13:09:09.453 に答える