Получение текста из UIAlertView

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

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

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

EDIT: Ok Я думаю, что мне не хватает метода для обработки alertview. И я нашел ... это:

- (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 ответов


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

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

UPDATE: этот ответ был опубликован до того, как 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"
    }
}

вам не нужно добавлять собственное текстовое поле в 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
    }
}

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

Я уже использовал такую же функциональность в своем приложении. Но Apple ОТКЛОНЕНО МОЕ ПРИЛОЖЕНИЕ из-за использования UITextView на UIAlertView.


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

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

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

не забудьте удалить [data addObject:[nameField text]]; и [mainTableView reloadData]; из метода insert.


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.