UITextFieldをUIAlertViewに配置して上に移動したので、キーボードが次のコードで覆い隠さないようにします。
[dialog setDelegate:self];
[dialog setTitle:@"Enter Name"];
[dialog addButtonWithTitle:@"Cancel"];
[dialog addButtonWithTitle:@"OK"];
UITextField * nameField = [[UITextField alloc] initWithFrame:CGRectMake(20.0, 45.0, 245.0, 25.0)];
[nameField setBackgroundColor:[UIColor whiteColor]];
[dialog addSubview:nameField];
CGAffineTransform moveUp = CGAffineTransformMakeTranslation(0.0, 100.0);
[dialog setTransform: moveUp];
[dialog show];
アラートビューを処理する次のコードもあります。
- (void) alertView:(UIAlertView *)alert clickedButtonAtIndex:(NSInteger)buttonIndex{
NSLog(@"%d", (int) buttonIndex);
if (buttonIndex == 1) { // OK pushed
NSLog([alert textField].text); // does not log anything
} else {
// Cancel pushed
}}
また、以下を含むUIAlertViewExtended.hファイルがあります。
@class UITextField, UILabel;
@interface UIAlertView(Extended)
-(UITextField *)textField;
@end
私の質問は、ユーザーが入力したテキストを取得する方法とキーボードを非表示にする方法です。
ありがとう、ベン
気になるかもしれない人のために、これが実用的な解決策です:
UIAlertView* dialog = [[UIAlertView alloc] init];
[dialog setDelegate:self];
[dialog setTitle:@"Enter Name"];
[dialog setMessage:@" "];
[dialog addButtonWithTitle:@"Cancel"];
[dialog addButtonWithTitle:@"OK"];
nameField = [[UITextField alloc] initWithFrame:CGRectMake(20.0, 45.0, 245.0, 25.0)];
[nameField setBackgroundColor:[UIColor whiteColor]];
[dialog addSubview:nameField];
CGAffineTransform moveUp = CGAffineTransformMakeTranslation(0.0, 100.0);
[dialog setTransform: moveUp];
[dialog show];
[dialog release];
[nameField release];
UITextField * nameFieldを作成したことを確認してください。 .hファイルでは、次のようにしてユーザーが入力したテキストを取得できます。inputText = [nameField text];
void)alertView:(UIAlertView *)alert clickedButtonAtIndex:(NSInteger)buttonIndexメソッド内。
---(重要な注意: iOS 4.0以降の場合、CGAffineTransform
は自動的に実行されるため、4.0以降のみをターゲットにしている場合は、このビットを省略できます。それ以外の場合は、使用しているOSを確認し、それに応じて処理する必要があります。
ARCでiOS 5.0以降をサポートしている人なら誰でも、設定できるこの直接のalertViewStyleプロパティがあります。
-(void)showAlertWithTextField{
UIAlertView* dialog = [[UIAlertView alloc] initWithTitle:@"Enter Name" message:@"" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Add", nil];
[dialog setAlertViewStyle:UIAlertViewStylePlainTextInput];
// Change keyboard type
[[dialog textFieldAtIndex:0] setKeyboardType:UIKeyboardTypeNumberPad];
[dialog show];
}
-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
if (buttonIndex == 1)
NSLog(@"%@",[[alertView textFieldAtIndex:0]text]);
}
チェックアウトする価値があります
完全で包括的なソリューションのために。
明示的な参照を維持せずにテキストフィールドを見つける簡単な方法は、タグを設定することです。
nameField.tag = ALERTVIEW_NAMEFIELD;
親ダイアログを含め、0や他のUIView
オブジェクトタグとは異なるものにしてください。
その後、alertView:clickedButtonAtIndex:
ハンドラーを使用すると、次の方法でテキストフィールドを取得できます。
UITextField *nameField = (UITextField *)[alertView viewWithTag:ALERTVIEW_NAMEFIELD];
より明確な解決策が見つかりました。次のコードスニペットを確認してください。 IAlertViewプロンプトのユーザー名とパスワードUITextFields
この実装を確認してください: https://github.com/josecastillo/EGOTextFieldAlertView
これはiOS5およびARC用です。
-(void)showAlert {
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"New Album"
message:@"Enter a name for the album."
delegate:self
cancelButtonTitle:@"Cancel"
otherButtonTitles:@"Save", nil];
alertView.alertViewStyle = UIAlertViewStylePlainTextInput;
UITextField* textfield = [alertView textFieldAtIndex:0];
textfield.placeholder = @"Title";
[alertView show];
}
-(void)alertView:(UIAlertView *)alertView
didDismissWithButtonIndex:(NSInteger)buttonIndex
{
if (buttonIndex != 1) {
NSLog(@"Cancel");
return;
}
UITextField* textfield = [alertView textFieldAtIndex:0];
NSLog(@"Save. text: %@", textfield.text);
}
非常に良い方法は、UITextFieldDelegateのデリゲートメソッドを使用して、キーボードがアクティブになっている場合にのみダイアログを上に移動できることです。下記参照。
- (void)textFieldDidBeginEditing:(UITextField *)textField {
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.5];
[UIView setAnimationDelegate:self];
CGAffineTransform moveUp = CGAffineTransformMakeTranslation(0.0, -20);
[dialog setTransform: moveUp];
[UIView commitAnimations];
}
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.5];
[UIView setAnimationDelegate:self];
CGAffineTransform moveDown = CGAffineTransformMakeTranslation(0.0, 0.0);
[dialog setTransform: moveDown];
[textField resignFirstResponder];
return YES;
}
これは実際には、通常のUIAlertViewコードの1行だけです。お役に立てれば!
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"test" message:@"This is a alert with a textfield" delegate:self cancelButtonTitle:@"YAY" otherButtonTitles:nil];
alert.alertViewStyle = UIAlertViewStylePlainTextInput;
[alert show];
[alert release];
iOS 5以降でのみ実行されます
IWasRobbedの回答に1つのマイナーなTweakを追加します。
GenericAlertDialogs.m:
+ (void)displayInputDialog:(NSString*)title delegate:(id<UIAlertViewDelegate>)delegate textFiled:(UITextField*)txtField
{
UIAlertView* dialog = [[UIAlertView alloc] init];
[dialog setDelegate:delegate];
[dialog setTitle:title];
[dialog setMessage:@" "];
[dialog addButtonWithTitle:@"Cancel"];
[dialog addButtonWithTitle:@"OK"];
if(UIInterfaceOrientationIsPortrait([[UIApplication sharedApplication] statusBarOrientation]))
{
txtField.frame = CGRectMake(20.0, 45.0, 245.0, 25.0);
}
else
{
txtField.frame = CGRectMake(20.0, 30.0, 245.0, 25.0);
}
[txtField becomeFirstResponder];
[txtField setBackgroundColor:[UIColor whiteColor]];
[dialog addSubview:txtField];
[dialog show];
}
その他の.mファイル(UIAlertViewDelegateを実装)
self->txtChangeName = [[UITextField alloc] init];
[GenericAlertDialogs displayInputDialog:@"Some title...:"
delegate:self
textFiled:txtChangeName];
UIAlertViewDelegateプロトコル処理:
- (void) alertView:(UIAlertView *)alert clickedButtonAtIndex:(NSInteger)buttonIndex
{
if(buttonIndex == 1)
{
if([txtChangeName.text length] > 0)
{
self->userInput = [txtChangeName text];
}
}
self->txtChangeName = nil;
}
iOS 4+準拠。