Получение текста из 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];
}
Теперь мне просто нужно соединить куски, но не уверен, как это сделать.
Ответы
Ответ 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.