2010-12-30 12 views
17

Próbuję uzyskać tekst z widoku alertu i dodać go do mojej tablicy zmiennych do listy w widoku tabeli. Zdaję sobie sprawę, że istnieje podobne pytanie, które zostało opublikowane kilka miesięcy temu, ale nie rozumiem, jak wykorzystać tę odpowiedź.Uzyskiwanie tekstu z 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]; 

Jednak moja aplikacja ulega awarii, ponieważ mówi, że próbuję wstawić obiekt zerowy w indeksie 0. Co robię źle?

EDYCJA: OK Myślę, że brakuje mi metody obsługi alertów. Więc znalazłem to:

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

    } 

Teraz wystarczy podłączyć kawałki, ale nie wiem jak.

Odpowiedz

45

Powszechnym błędem popełnianym przez użytkowników podczas korzystania z UIAlertView jest to, że sądzą, że wysłanie wiadomości show spowoduje zablokowanie głównego wątku. To nie. Twój kod będzie nadal wykonywany, nawet jeśli na ekranie pojawi się alert. Zatem nie istnieje wartość dla UITextField, które zostały przekazane w.

Co trzeba zrobić, to wdrożenie UIAlertViewDelegate w swojej UIViewController chwycić cokolwiek użytkownik wpisał w polu tekstowym. Mimo to musisz sprawdzić wartość nil, ponieważ jeśli niczego nie wpiszesz, wartośćbędzie wynosić nil.

UPDATE: Ta odpowiedź została wysłana przed Jabłko stworzył API do dodawania UITextField do wpisu poprzez UIAlertViewStyle. Oto zaktualizowany kod, zapożyczone z @matt

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

Następnie w zaproszeniu UIAlertViewDelegate tyłu:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { 
    if (buttonIndex == 1) { 
     NSString *name = [alertView textFieldAtIndex:0].text; 
     // Insert whatever needs to be done with "name" 
    } 
} 
+0

Moja aplikacja to aplikacja oparta na oknach. Czy to ma znaczenie? – Snowman

+0

@ f-Prime Nie, to nie ma znaczenia. Przechodzimy przez hierarchię UIAlertView. –

+0

OK, więc jak powinien wyglądać mój pełny kod? Moja metoda dodawania plus metoda clickedButtonAtIndex i powinna działać? Czy w metodzie dodawania muszę wywoływać clickedButtonAtIndex? Bo jak jest teraz, nie działa – Snowman

0

– alertView:clickedButtonAtIndex: to metoda delegata UIAlertView. Po prostu dodaj metodę zdefiniowaną w edytorze do implementacji kontrolera i powinieneś być dobry, ponieważ już ustawiłeś kontroler na delegata AlertView.

dodać także do nagłówka klasy, aby uniknąć ostrzeżenia delegata związane, tj:

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

Nie zapomnij usunąć [data addObject:[nameField text]]; i [mainTableView reloadData]; z metody insert.

+0

OK Zrobiłem to, ale otrzymałem błąd "imiennego pola niezadeklarowanego" w metodzie clickedButtonAtIndex. – Snowman

0
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;    

Nie ma potrzeby, aby dodać niestandardowe pole tekstowe. Możesz dodać bezpośrednio za pomocą metody addTextFieldWithValue.

+0

UIAlertView nie ma metody "addTextFieldWithValue: label:" –

3

Nie próbuj dodawać UITextView na urządzeniu UIAlertView, ponieważ Apple może odrzucić Twoją aplikację.

Już użyłem tego samego rodzaju funkcjonalności w mojej aplikacji. Ale Apple ODRZUCONO MOJĄ APLIKACJĘ z powodu użycia UITextView w UIAlertView.

27

Nie trzeba dodać własne pole tekstowe do AlertView ale zamiast ustawić odpowiedni styl

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

Wtedy dostęp wprowadzony tekst po OK (przycisk 1) został naciśnięty

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
{ 
    if (buttonIndex == 1) { 
     NSString *name = [alertView textFieldAtIndex:0].text; 
     // name contains the entered value 
    } 
} 
+0

Uwaga: działa tylko na iOS5 + –