In iOS 5 there is a new and easy way to this. I'm not sure if the implementation is fully complete yet as it's not a gracious as, say, a UITableViewCell
, but it should definitly do the trick as it is now standard supported in the iOS API. You will not need a private API for this.
UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"Alert" message:@"This is an example alert!" delegate:self cancelButtonTitle:@"Hide" otherButtonTitles:nil];
alert.alertViewStyle = UIAlertViewStylePlainTextInput;
[alert show];
[alert release];
This renders an alertView like this (screenshot taken from the iPhone 5.0 simulator in XCode 4.2):
When pressing any buttons, the regular delegate methods will be called and you can extract the textInput there like so:
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
NSLog(@"Entered: %@",[[alertView textFieldAtIndex:0] text]);
}
Here I just NSLog the results that were entered. In production code, you should probably keep a pointer to your alertView as a global variable or use the alertView tag to check if the delegate function was called by the appropriate UIAlertView
but for this example this should be okay.
You should check out the UIAlertView API and you'll see there are some more styles defined.
Hope this helped!
-- EDIT --
I was playing around with the alertView a little and I suppose it needs no announcement that it's perfectly possible to edit the textField as desired: you can create a reference to the UITextField
and edit it as normal (programmatically).
Doing this I constructed an alertView as you specified in your original question. Better late than never, right :-)?
UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"Hello!" message:@"Please enter your name:" delegate:self cancelButtonTitle:@"Continue" otherButtonTitles:nil];
alert.alertViewStyle = UIAlertViewStylePlainTextInput;
UITextField * alertTextField = [alert textFieldAtIndex:0];
alertTextField.keyboardType = UIKeyboardTypeNumberPad;
alertTextField.placeholder = @"Enter your name";
[alert show];
[alert release];
This produces this alert:
You can use the same delegate method as I poster earlier to process the result from the input. I'm not sure if you can prevent the UIAlertView
from dismissing though (there is no shouldDismiss
delegate function AFAIK) so I suppose if the user input is invalid, you have to put up a new alert (or just reshow
this one) until correct input was entered.
Have fun!
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…