Простий спосіб отримати діалогове вікно введення тексту на iPhone


125

Я хочу отримати ім’я користувача. Просте діалогове вікно введення тексту. Будь-який простий спосіб зробити це?


1
просто зачекайте кілька місяців, приблизно до вересня, і вам життя стане набагато легшим.
Джонатан.

Відповіді:


264

В 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):

приклад попередження з функцією alarViewStyle встановлено на UIAlertViewStylePlainTextInput

При натисканні будь-яких кнопок буде викликано звичайний метод делегування, і ви можете витягнути там текст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, який використовує попередження UIAlertViewPlainTextInputStyle, щоб запитати ім'я користувача

Ви можете використовувати той самий метод делегування, як я раніше, щоб обробити результат із вхідних даних. Я не впевнений, чи можете ви запобігти UIAlertViewвідхиленню, хоча (немає shouldDismissфункції делегування AFAIK), тому я вважаю, що якщо введення користувача недійсне, вам потрібно буде подати нове попередження (або просто повторно showце), поки правильне введення не було введено.

Веселіться!


1
Завдяки автоматичному підрахунку довідок ви більше не повинні зберігати та випускати об'єкти самостійно.
Waqleh

5
Я знаю, але ця відповідь була написана в 2011 р.
Warkst

3
Спосіб знецінюється, починаючи з IOS 9.0. Використовуйте замість UIAlertController:
EckhardN

Якщо ви шукаєте підтримку з Swift 4: stackoverflow.com/a/10689318/525576
Джон Riselvato

186

Щоб переконатися, що ви отримуєте зворотний дзвінок після введення користувачем тексту, встановіть делегата всередині обробника конфігурації. 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 Роботи)

Просто для додання іншої версії.

UIAlert з UITextField

- (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) {
        ...

    }
}


1
У мене було щось подібне з IOS 4, але, здається, він зламався в ОС 7 Тепер використовуйте код Wakrst - збережіть багато рядків коду.
Дейв Епплтон

Отже, який би був правильний спосіб зробити це для iOS7? Ми будуємо з iOS6 SDK, але він все ще дивно виглядає на iOS7.
sebrock

Додано підтримку iOS7 до питання
Джон Різельвато

1
Виявив, що мені довелося помістити наступне у своєму alertView:(UIAlertView *) clickedButtonAtIndex:(NSInteger)buttonIndexметоді делегатів, щоб отримати значення textField.text: `NSString * theMessage = [alertView textFieldAtIndex: 0] .text;`
Джеймс Перих

1
замініть "var alert" на "нехай сповіщення" у коді swift, щоб відповідати останній версії swift
Matei Suica

11

Випробуваний третій фрагмент коду Варкста - працював чудово, за винятком того, що я змінив його на тип введення за замовчуванням замість числового:

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];

Гарна думка! Я возився з textField у той час і забув змінити тип клавіатури, перш ніж завантажувати фрагмент коду. Радий, що мій код може вам допомогти!
Warkst

11

Оскільки 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];

5

Просто хотілося додати важливу інформацію, яку, на мою думку, залишили, можливо, з припущенням, що ті, хто шукає відповіді, можливо, вже знають. Ця проблема трапляється багато, і я теж застряг, коли спробував реалізувати viewAlertметод для кнопок UIAlertViewповідомлення. Для цього вам потрібно спочатку додати клас делегата, який може виглядати приблизно так:

@interface YourViewController : UIViewController <UIAlertViewDelegate>

Також ви можете знайти дуже корисний підручник тут !

Сподіваюся, це допомагає.


5

Спробуйте цей код 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

Швидкий 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)

2

Я б використовував a UIAlertViewз UITextFieldпідглядом. Можна або додати текстове поле вручну, або в iOS 5 скористатися одним із нових методів.


Я додав наступний код з іншої публікації, але спливаюче вікно з'являється на екрані (дуже багато вгорі, видно лише нижню половину)
user605957

2
codeUIAlertView * 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 реліз];
user605957

Я спробував подібний код, і він відображає огляд попередження з текстовим полем і кнопками, але для текстового поля недостатньо місця, він застряг між заголовком і кнопками і торкається їх обох. Я спробував кілька перетворень для масштабування кадру, але кнопки залишаються там, де вони були, тоді їх також потрібно перемістити. Я не знаю, як переставити кнопки, і не можу повірити, що все це необхідно для отримання одного рядка тексту з підказки для користувача. Хіба немає кращого способу, ніж цей?
Дін Девідс

2

Додати погляди на UIAlertView , як це . В iOS 5 є деякі "магічні" речі, які роблять це за вас (але це все під NDA).


Я спробував це, і це дещо спрацьовує. За винятком того, що спливаюче вікно вимкнеться з екрана (верхня половина спливаючого меню відсікається). Будь-які ідеї чому?
user605957

У мене була така ж проблема, видаливши setTranformMakeTranslation (0,109), виправили це як на ipad, так і на iphone. Він виявився в потрібному місці без нього.
провести

2

У 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();

0

Спираючись на відповідь Джона Різельвато, щоб повернути рядок назад з 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
        })

-1
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];
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.