Я хочу отримати ім’я користувача. Просте діалогове вікно введення тексту. Будь-який простий спосіб зробити це?
Я хочу отримати ім’я користувача. Просте діалогове вікно введення тексту. Будь-який простий спосіб зробити це?
Відповіді:
В iOS 5 є новий і простий шлях до цього. Я не впевнений, чи реалізація повністю завершена, оскільки вона не є приємною, як, скажімо, а UITableViewCell
, але вона, безумовно, повинна зробити трюк, як це зараз стандартно підтримується в iOS API. Для цього вам не знадобиться приватний API.
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];
Це робить попереджуючий перегляд подібним чином (скріншот, зроблений із симулятора iPhone 5.0 у XCode 4.2):
При натисканні будь-яких кнопок буде викликано звичайний метод делегування, і ви можете витягнути там текстInput так:
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
NSLog(@"Entered: %@",[[alertView textFieldAtIndex:0] text]);
}
Тут я просто NSLog результати, які були введені. У виробничому коді ви, ймовірно, повинні тримати вказівник на ваш упереджений вигляд як глобальну змінну або використовувати тег alarview, щоб перевірити, чи викликана функція делегата відповідною, UIAlertView
але для цього прикладу це повинно бути добре.
Слід перевірити API UIAlertView, і ви побачите, що визначено ще кілька стилів.
Сподіваюся, це допомогло!
- EDIT -
Я трохи розігрувався з alertView, і, мабуть, йому не потрібно повідомляти, що цілком можливо відредагувати textField за бажанням: ви можете створити посилання на UITextField
та редагувати його як звичайне (програмно). Роблячи це, я сконструював попередження, як ви вказали у своєму початковому запитанні. Краще пізно, ніж ніколи, правда :-)?
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];
Це викликає це сповіщення:
Ви можете використовувати той самий метод делегування, як я раніше, щоб обробити результат із вхідних даних. Я не впевнений, чи можете ви запобігти UIAlertView
відхиленню, хоча (немає shouldDismiss
функції делегування AFAIK), тому я вважаю, що якщо введення користувача недійсне, вам потрібно буде подати нове попередження (або просто повторно show
це), поки правильне введення не було введено.
Веселіться!
Щоб переконатися, що ви отримуєте зворотний дзвінок після введення користувачем тексту, встановіть делегата всередині обробника конфігурації. textField.delegate = self
Swift 3 і 4 (iOS 10 - 11):
let alert = UIAlertController(title: "Alert", message: "Message", preferredStyle: UIAlertControllerStyle.alert)
alert.addAction(UIAlertAction(title: "Click", style: UIAlertActionStyle.default, handler: nil))
alert.addTextField(configurationHandler: {(textField: UITextField!) in
textField.placeholder = "Enter text:"
textField.isSecureTextEntry = true // for password input
})
self.present(alert, animated: true, completion: nil)
У Swift (iOS 8-10):
override func viewDidAppear(animated: Bool) {
var alert = UIAlertController(title: "Alert", message: "Message", preferredStyle: UIAlertControllerStyle.Alert)
alert.addAction(UIAlertAction(title: "Click", style: UIAlertActionStyle.Default, handler: nil))
alert.addTextFieldWithConfigurationHandler({(textField: UITextField!) in
textField.placeholder = "Enter text:"
textField.secureTextEntry = true
})
self.presentViewController(alert, animated: true, completion: nil)
}
В Objective-C (iOS 8):
- (void) viewDidLoad
{
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Alert" message:@"Message" preferredStyle:UIAlertControllerStyleAlert];
[alert addAction:[UIAlertAction actionWithTitle:@"Click" style:UIAlertActionStyleDefault handler:nil]];
[alert addTextFieldWithConfigurationHandler:^(UITextField *textField) {
textField.placeholder = @"Enter text:";
textField.secureTextEntry = YES;
}];
[self presentViewController:alert animated:YES completion:nil];
}
ДЛЯ iOS 5-7:
UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"Alert" message:@"INPUT BELOW" delegate:self cancelButtonTitle:@"Hide" otherButtonTitles:nil];
alert.alertViewStyle = UIAlertViewStylePlainTextInput;
[alert show];
ПРИМІТКА. Нижче не працює з iOS 7 (iOS 4 - 6 Роботи)
Просто для додання іншої версії.
- (void)viewDidLoad{
UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"Preset Saving..." message:@"Describe the Preset\n\n\n" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Ok", nil];
UITextField *textField = [[UITextField alloc] init];
[textField setBackgroundColor:[UIColor whiteColor]];
textField.delegate = self;
textField.borderStyle = UITextBorderStyleLine;
textField.frame = CGRectMake(15, 75, 255, 30);
textField.placeholder = @"Preset Name";
textField.keyboardAppearance = UIKeyboardAppearanceAlert;
[textField becomeFirstResponder];
[alert addSubview:textField];
}
то я дзвоню, [alert show];
коли хочу.
Метод, який іде далі
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
NSString* detailString = textField.text;
NSLog(@"String is: %@", detailString); //Put it on the debugger
if ([textField.text length] <= 0 || buttonIndex == 0){
return; //If cancel or 0 length string the string doesn't matter
}
if (buttonIndex == 1) {
...
}
}
alertView:(UIAlertView *) clickedButtonAtIndex:(NSInteger)buttonIndex
методі делегатів, щоб отримати значення textField.text: `NSString * theMessage = [alertView textFieldAtIndex: 0] .text;`
Випробуваний третій фрагмент коду Варкста - працював чудово, за винятком того, що я змінив його на тип введення за замовчуванням замість числового:
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 = UIKeyboardTypeDefault;
alertTextField.placeholder = @"Enter your name";
[alert show];
Оскільки IOS 9.0 використовує UIAlertController:
UIAlertController* alert = [UIAlertController alertControllerWithTitle:@"My Alert"
message:@"This is an alert."
preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault
handler:^(UIAlertAction * action) {
//use alert.textFields[0].text
}];
UIAlertAction* cancelAction = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleDefault
handler:^(UIAlertAction * action) {
//cancel action
}];
[alert addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
// A block for configuring the text field prior to displaying the alert
}];
[alert addAction:defaultAction];
[alert addAction:cancelAction];
[self presentViewController:alert animated:YES completion:nil];
Просто хотілося додати важливу інформацію, яку, на мою думку, залишили, можливо, з припущенням, що ті, хто шукає відповіді, можливо, вже знають. Ця проблема трапляється багато, і я теж застряг, коли спробував реалізувати viewAlert
метод для кнопок UIAlertView
повідомлення. Для цього вам потрібно спочатку додати клас делегата, який може виглядати приблизно так:
@interface YourViewController : UIViewController <UIAlertViewDelegate>
Також ви можете знайти дуже корисний підручник тут !
Сподіваюся, це допомагає.
Спробуйте цей код Swift в UIViewController -
func doAlertControllerDemo() {
var inputTextField: UITextField?;
let passwordPrompt = UIAlertController(title: "Enter Password", message: "You have selected to enter your passwod.", preferredStyle: UIAlertControllerStyle.Alert);
passwordPrompt.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: { (action) -> Void in
// Now do whatever you want with inputTextField (remember to unwrap the optional)
let entryStr : String = (inputTextField?.text)! ;
print("BOOM! I received '\(entryStr)'");
self.doAlertViewDemo(); //do again!
}));
passwordPrompt.addAction(UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Default, handler: { (action) -> Void in
print("done");
}));
passwordPrompt.addTextFieldWithConfigurationHandler({(textField: UITextField!) in
textField.placeholder = "Password"
textField.secureTextEntry = false /* true here for pswd entry */
inputTextField = textField
});
self.presentViewController(passwordPrompt, animated: true, completion: nil);
return;
}
Швидкий 3:
let alert = UIAlertController(title: "Alert", message: "Message", preferredStyle: UIAlertControllerStyle.alert)
alert.addAction(UIAlertAction(title: "Click", style: UIAlertActionStyle.default, handler: nil))
alert.addTextField(configurationHandler: {(textField: UITextField!) in
textField.placeholder = "Enter text:"
})
self.present(alert, animated: true, completion: nil)
Я б використовував a UIAlertView
з UITextField
підглядом. Можна або додати текстове поле вручну, або в iOS 5 скористатися одним із нових методів.
code
UIAlertView * myAlertView = [[[UIAlertView alloc] initWithTitle: @ "Ваше заголовок тут" повідомлення: @ "це покривається" делегат: самозаписуватиButtonTitle: @ "Скасувати" otherButtonTitles: @ "ОК", нуль]; UITextField * myTextField = [[UITextField alloc] initWithFrame: CGRectMake (12.0, 45.0, 260.0, 25.0)]; CGAffineTransform myTransform = CGAffineTransformMakeTranslation (0,0, 130,0); [myAlertView setTransform: myTransform]; [myTextField setBackgroundColor: [UIColor whiteColor]]; [myAlertView addSubview: myTextField]; [myAlertView шоу]; [myAlertView реліз];
Додати погляди на UIAlertView , як це . В iOS 5 є деякі "магічні" речі, які роблять це за вас (але це все під NDA).
У Xamarin та C #:
var alert = new UIAlertView ("Your title", "Your description", null, "Cancel", new [] {"OK"});
alert.AlertViewStyle = UIAlertViewStyle.PlainTextInput;
alert.Clicked += (s, b) => {
var title = alert.ButtonTitle(b.ButtonIndex);
if (title == "OK") {
var text = alert.GetTextField(0).Text;
...
}
};
alert.Show();
Спираючись на відповідь Джона Різельвато, щоб повернути рядок назад з UIAlertView ...
alert.addAction(UIAlertAction(title: "Submit", style: UIAlertAction.Style.default) { (action : UIAlertAction) in
guard let message = alert.textFields?.first?.text else {
return
}
// Text Field Response Handling Here
})
UIAlertview *alt = [[UIAlertView alloc]initWithTitle:@"\n\n\n" message:nil delegate:nil cancelButtonTitle:nil otherButtonTitles:@"OK", nil];
UILabel *lbl1 = [[UILabel alloc]initWithFrame:CGRectMake(25,17, 100, 30)];
lbl1.text=@"User Name";
UILabel *lbl2 = [[UILabel alloc]initWithFrame:CGRectMake(25, 60, 80, 30)];
lbl2.text = @"Password";
UITextField *username=[[UITextField alloc]initWithFrame:CGRectMake(130, 17, 130, 30)];
UITextField *password=[[UITextField alloc]initWithFrame:CGRectMake(130, 60, 130, 30)];
lbl1.textColor = [UIColor whiteColor];
lbl2.textColor = [UIColor whiteColor];
[lbl1 setBackgroundColor:[UIColor clearColor]];
[lbl2 setBackgroundColor:[UIColor clearColor]];
username.borderStyle = UITextBorderStyleRoundedRect;
password.borderStyle = UITextBorderStyleRoundedRect;
[alt addSubview:lbl1];
[alt addSubview:lbl2];
[alt addSubview:username];
[alt addSubview:password];
[alt show];