0

サブクラス化して、その中に入力を受け取るUIAlertViewa を表示しています。ユーザーがキーボードをtextFieldクリックすると表示され、上に移動してキーボードを調整します。しかし、のデリゲート メソッドで行うと、alertView はキーボードを調整するために上に移動しません。代わりに、キーボードの後ろに隠れます。textFieldUIAlertView[textField becomeFirstResponder]didPresentAlertViewUIAlertViewUIAlertView

UIAlertViewPS - Apple がそれをサブクラス化してそのまま使用するべきではないと言っていることは知っていますがUIAlertView、Apple のデフォルトの UI 要素を再設計したいので、サブクラス化しています。

4

2 に答える 2

1

Apple の推奨に反することをするべきではありません。

理由

  1. 直面しているような予期しない問題に直面する可能性があります。
  2. 推奨事項に違反しているため、将来の iOS リリースでコードが壊れる可能性があります。
  3. Apple の標準コントロールの再設計は、HIG ガイドラインに違反しています。その結果、アプリが拒否される可能性があります。代わりに、UIViewサブクラスを使用して独自のものを作成してください。

別の方法として、Apple はUIAlertViewこの要件を規定しています。アラート ビューにテキスト フィールドを追加する必要はありません。代わりに、UIAlertViewプロパティを使用しますalertViewStyle。列挙型で定義された値を受け入れますUIAlertViewStyle

typedef NS_ENUM(NSInteger, UIAlertViewStyle) {
    UIAlertViewStyleDefault = 0,
    UIAlertViewStyleSecureTextInput, // Secure text input
    UIAlertViewStylePlainTextInput,  // Plain text input
    UIAlertViewStyleLoginAndPasswordInput // Two text fields, one for username and other for password
};

例として、ユーザーからパスワードを受け入れたいというユースケースを想定してみましょう。これを実現するコードは次のとおりです。

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Please enter password"
                                                  message:nil
                                                 delegate:self
                                        cancelButtonTitle:@"Cancel"
                                        otherButtonTitles:@"Continue", nil];
[alert setAlertViewStyle:UIAlertViewStyleSecureTextInput];
[alert show];

入力を検証するには、入力されたパスワードは最低 6 文字である必要があり、このデリゲート メソッドを実装するとします。

- (BOOL)alertViewShouldEnableFirstOtherButton:(UIAlertView *)alertView
{
    NSString *inputText = [[alertView textFieldAtIndex:0] text];
    if( [inputText length] >= 6 )
    {
        return YES;
    }
    else
    {
        return NO;
    }
}

ユーザー入力を取得するには

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    NSString *title = [alertView buttonTitleAtIndex:buttonIndex];
    if([title isEqualToString:@"Login"])
    {
        UITextField *password = [alertView textFieldAtIndex:0];
        NSLog(@"Password: %@", password.text);
    }
}

繰り返し UIAlertViewますが、プライベート ビュー階層があり、変更せずにそのまま使用することをお勧めします。推奨事項に反して使用すると、予期しない結果が得られます。

アップルのドキュメントから

UIAlertView クラスはそのまま使用することを意図しており、サブクラス化はサポートしていません。このクラスのビュー階層は非公開であり、変更してはなりません。

これは、iOS の既定のアプリ (例: Wi-Fi パスワードの入力など) でも使用される標準的な手法であるため、これを使用すると、言及したような問題に直面しないことが保証されます。

それが役立つことを願っています!

于 2013-08-21T10:16:33.793 に答える