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