Подтвердить что ты не робот

Получение текста из 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];

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

EDIT: Хорошо. Я думаю, что мне не хватает метода обработки предупреждения. Поэтому я нашел это:

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

    }

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

4b9b3361

Ответ 1

Общей ошибкой, которую люди делают при использовании 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"
    }
}

Ответ 2

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

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

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

Ответ 4

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

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

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

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

Ответ 5

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.