0

ユーザーが戻るボタンを押したときに非表示にしたいテキストフィールドがあります。テキストフィールドはInterfaceBuilderで作成され、.hファイルにテキストフィールドデリゲートを追加し、テキストフィールドのデリゲートをファイル所有者として設定しました。

@interface ProfileEdit : UIViewController<UITextFieldDelegate>{
    UITextField *textfield1;
    UITextField *textfield2;
    UITextField *textfield3;
}

- (void)viewDidLoad
{
textfield1 = [[UITextField alloc] initWithFrame:CGRectMake(20, 49, 164, 31)];
[textfield1 setDelegate:self];
[textfield1 setAutocorrectionType:UITextAutocorrectionTypeNo];
[self.view addSubview:textfield1];
textfield2 = [[UITextField alloc] initWithFrame:CGRectMake(20, 124, 164, 31)];
[textfield2 setDelegate:self];
[textfield2 setAutocorrectionType:UITextAutocorrectionTypeNo];
[self.view addSubview:textfield2] 
textfield3 = [[UITextField alloc] initWithFrame:CGRectMake(20, 198, 164, 31)];
[textfield3 setDelegate:self];
[textfield3 setAutocorrectionType:UITextAutocorrectionTypeNo];
[self.view addSubview:textfield3];
[super viewDidLoad];
}

また、touchupinsideイベントがトリガーされるバックグラウンドにボタンを配置しました

-(IBAction)hideKeyboard:(id)sender{
    [textfield1 resignFirstResponder];
    [textfield2 resignFirstResponder];
    [textfield3 resignFirstResponder];
}

これは正常に機能し、エラーは発生しません。しかし、これのために

-(BOOL)textFieldShouldReturn:(UITextField *)textField{
    [self hideKeyboard:nil];
    return YES;
}

main.mでEXC_BAD_ACCESSを取得します。私はこれに数日間立ち往生していて、なぜこれが起こっているのか分かりません。

4

4 に答える 4

2

私はこれをiPhoneでテストしましたが、エラーはありませんでした。シミュレーターそのものと関係があると思います。[testField resignFirstResponder]に遅延を設定しても、シミュレーターでエラーがスローされないことがわかりました

于 2011-08-26T19:17:13.640 に答える
1

EXC_BAD_ACCESSエラーの場合、通常、解放されたオブジェクトにメッセージを送信しようとしています。これらを追跡する最良の方法は、NSZombieEnabled使用することです。

これは、実際にオブジェクトを解放することはありませんが、オブジェクトを「ゾンビ」としてラップし、通常は解放されることを示すフラグをオブジェクト内に設定することで機能します。このように、もう一度アクセスしようとすると、エラーが発生する前の状態がわかります。この少しの情報があれば、通常はバックトラックして問題の内容を確認できます。

これは、デバッガーが有用な情報を取得することがある場合に、バックグラウンドスレッドで特に役立ちます。

ただし、非常に重要な点は、これがデバッグコードにのみ含まれ、配布コードには含まれないことを100%確認する必要があるということです。何もリリースされていないため、アプリがリークし、リークしてリークします。これを行うように私に思い出させるために、私はこのログを私のappdelegateに入れました:

if (getenv("NSZombieEnabled"))
  NSLog(@"NSZombieEnabled enabled!");

正確な行を見つけるのに助けが必要な場合は、ビルドアンドラン( CMD-R )の代わりにビルドアンドデバッグ( CMD-Y )を実行してください。アプリがクラッシュすると、デバッガーは正確にどの行を表示し、NSZombieEnabledと組み合わせて、正確な理由を見つけることができるはずです。

于 2011-08-21T19:56:37.193 に答える
1

textFieldShouldReturnの戻り値をNOに変更します。

ビューコントローラを表示しているときにresignFirstResponderを呼び出さなくても、この問題が発生しました。

于 2011-08-25T11:02:59.680 に答える
0

hideKeyboardメソッドを次のように書き直す必要があります。

- (IBAction)hideKeyboard:(id)sender; {
  if ([textfield1 isFirstResponder]) {
    [textfield1 resignFirstResponder];
  }
  if ([textfield2 isFirstResponder]) {
    [textfield2 resignFirstResponder];
  }
  if ([textfield3 isFirstResponder]) {
    [textfield3 resignFirstResponder];
  }
}

また、アウトレットがすべてnibに正しく接続されていること、およびファイルが。であることUITextFieldDelegate、およびテキストフィールドのデリゲートがnibのファイル所有者に接続されていることを確認してください。これで(うまくいけば)問題が解決するはずです。

編集:あなたはUITextFieldsペン先に3を入れて、そのようにそれらを接続してみるべきです。通常、問題が少なくなり、必要に応じて後で設計を変更する方が簡単です。

お役に立てば幸いです。

于 2011-08-21T19:53:03.137 に答える