Получение текста из UIAlertView - PullRequest
17 голосов
/ 30 декабря 2010

Я пытаюсь получить текст из представления предупреждений и добавить его в свой изменяемый массив для отображения в виде таблицы.Я понимаю, что есть похожий вопрос, который был опубликован несколько месяцев назад, но я не понимаю, как использовать данный ответ.

-(IBAction)insert {
    UIAlertView* dialog = [[UIAlertView alloc] init];
    [dialog setDelegate:self];
    [dialog setTitle:@"Enter Name"];
    [dialog setMessage:@" "];
    [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];
    [dialog show];

    [data addObject:[nameField text]];
    [mainTableView reloadData];

Однако мое приложение аварийно завершает работу, поскольку оно говорит, что я пытаюсь вставить нулевой объект с индексом 0. Что я делаю неправильно?метод для обработки просмотра предупреждений.Итак, я нашел это:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
    NSString *buttonTitle=[alertView buttonTitleAtIndex:buttonIndex];
    if([buttonTitle isEqualToString:@"Cancel"]) {
        return;
    }
    else if([buttonTitle isEqualToString:@"Ok"]) {
        [data addObject:nameField.text];

    }

Теперь мне просто нужно соединить кусочки, но не уверен, как.

Ответы [ 5 ]

45 голосов
/ 30 декабря 2010

Распространенная ошибка, которую допускают люди при использовании UIAlertView, заключается в том, что они думают, что отправка сообщения show заблокирует основной поток.Это не.Ваш код продолжает выполняться, даже если на экране есть предупреждение.Таким образом, не существует значения для UITextField, которое вы передали.

Что вам нужно сделать, это реализовать UIAlertViewDelegate в вашем UIViewController, чтобы получить все, что пользователь ввел в текстовое поле.Тем не менее, вы все равно должны проверить значение nil, потому что если вы ничего не введете, значение text будет nil.

ОБНОВЛЕНИЕ: Этот ответ был опубликован до Appleсоздал API для добавления UITextField к предупреждению через UIAlertViewStyle.Вот обновленный код, заимствованный у @ matt

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Enter Name"
                                                message:@"  "   
                                               delegate:self 
                                      cancelButtonTitle:@"Cancel"
                                      otherButtonTitles:@"OK", nil];
alert.alertViewStyle = UIAlertViewStylePlainTextInput;
[alert show];

Затем в UIAlertViewDelegate перезвоните:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
    if (buttonIndex == 1) {
        NSString *name = [alertView textFieldAtIndex:0].text;
        // Insert whatever needs to be done with "name"
    }
}
27 голосов
/ 11 января 2012

Вам не нужно добавлять свое собственное текстовое поле в AlertView, вместо этого установите соответствующий стиль

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Enter Name"
                                                message:@"  "   
                                               delegate:self 
                                      cancelButtonTitle:@"Cancel"
                                      otherButtonTitles:@"OK", nil];
alert.alertViewStyle = UIAlertViewStylePlainTextInput;
[alert show];

Затем получите доступ к введенному тексту после нажатия OK (кнопка 1)

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    if (buttonIndex == 1) {
        NSString *name = [alertView textFieldAtIndex:0].text;
        // name contains the entered value
    }
}
3 голосов
/ 05 января 2011

Не пытайтесь добавить UITextView на UIAlertView, иначе Apple может отклонить ваше приложение.

Я уже использовал такую ​​же функциональность в своем приложении.Но Apple отклонил мое приложение из-за использования UITextView в UIAlertView.

0 голосов
/ 30 декабря 2010
UIAlertView *myAlert = [[UIAlertView alloc] initWithTitle:@"Alert title" 
                                                  message:@"alert message" 
                                                 delegate:self 
                                        cancelButtonTitle:@"Cancel" 
                                        otherButtonTitles:@"Ok", nil];
[myAlert addTextFieldWithValue:nil label:@"<place holder>"];
[[myAlert textField] setTextAlignment:UITextAlignmentCenter];
[[myAlert textField] becomeFirstResponder];
[myAlert show];
[myAlert release];
myAlert = nil;               

Нет необходимости добавлять пользовательское текстовое поле.Вы можете напрямую добавить метод addTextFieldWithValue.

0 голосов
/ 30 декабря 2010

– alertView:clickedButtonAtIndex: - это метод делегата UIAlertView.Просто добавьте метод, который вы определили в своем редактировании, к реализации вашего контроллера, и вам будет хорошо, если вы уже настроили контроллер как делегат AlertView.

Также добавьте в заголовок вашего класса, чтобы избежать любого делегатасвязанные предупреждения, например:

@interface MyViewController : UIViewController <UIAlertViewDelegate> {
...
};

Не забудьте удалить [data addObject:[nameField text]]; и [mainTableView reloadData]; из метода вставки.

...