Apple の推奨に反することをするべきではありません。
理由
- 直面しているような予期しない問題に直面する可能性があります。
- 推奨事項に違反しているため、将来の iOS リリースでコードが壊れる可能性があります。
- 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 パスワードの入力など) でも使用される標準的な手法であるため、これを使用すると、言及したような問題に直面しないことが保証されます。
それが役立つことを願っています!