2012-12-31 2 views
5

Eventuali duplicati:
dismissModalViewController AND pass data backCome passare un valore al controllore della vista genitore?

Sono nuovo di sviluppo iOS e bloccato su questo problema:

sto usando storyboard e hanno un controller di navigazione, vcA, con un TableView in esso che mostra alcuni dati da un MutableArray (che è inizializzato in viewdidload della stessa classe). Dopo aver selezionato una cella, un secondo controller di visualizzazione, vcB, viene visualizzato con un TextField e un pulsante chiamato "Aggiungi all'elenco".

Quello che voglio è che quando inserisco del testo nello TextField e preme il pulsante "Aggiungi all'elenco" il testo dovrebbe essere aggiunto alla matrice della vista precedente (che viene mostrata nello) e quando tocco il Il pulsante "Indietro" sulla barra di navigazione di vcB, vcA dovrebbe mostrare l'aggiornamento con la nuova voce in esso (nella parte superiore dell'elenco). Fondamentalmente voglio aggiungere il testo dal vcB all'array e mostrare il nuovo array dopo aver cliccato sul pulsante INDIETRO.

Ho cercato molto su questo problema e sembra che il delegato e i protocolli siano il modo per ottenere il risultato desiderato, ma ho difficoltà a comprendere la delega.

+2

[What Have you tried?] (Http://mattgemmell.com/2008/12/08/what-have-tried/) – Foggzie

+2

Questo è stato chiesto e ha risposto troppe volte per contare. http://stackoverflow.com/a/6204427/1271826 – Rob

risposta

13

ho il secondo controller della vista si presenta come modale in questo esempio:

Nella seconda vista controllori h di file:

@protocol SecondViewControllerDelegate <NSObject> 
- (void)addItemViewController:(id)controller didFinishEnteringItem:(NSString *)item; 
@end 

@interface SecondPageViewController : UIViewController <UITextViewDelegate> 
{ 
    NSString *previouslyTypedInformation; 
} 

@property (weak, nonatomic) IBOutlet UITextView *textView; 
@property (nonatomic) NSString *previouslyTypedInformation; 
@property (nonatomic, weak) id <SecondViewControllerDelegate> delegate; 

Nella seconda vista controllori m file di fare in modo di sintetizzare le proprietà e add quindi aggiungere questo:

- (IBAction)done:(id)sender 
{ 
    NSString *itemToPassBack = self.textView.text; 
    NSLog(@"returning: %@",itemToPassBack); 
    [self.delegate addItemViewController:self didFinishEnteringItem:itemToPassBack]; 
    //dismiss modal view controller here 
} 

poi nel primo file h vista controllori impostarlo come delegato:

@interface FirstPageViewController: UIViewController <SecondViewControllerDelegate> 
@property (nonatomic) NSString *returnedItem; 

Poi, nel sintetizzare m file la prima del controller della vista e aggiungere il metodo:

- (void)addItemViewController:(SecondPageViewController *)controller didFinishEnteringItem: (NSString *)item 
{ 
    //using delegate method, get data back from second page view controller and set it to property declared in here 
    NSLog(@"This was returned from secondPageViewController: %@",item); 
    self.returnedItem=item; 

    //add item to array here and call reload 
} 

Ora avete il testo di ciò che è stato restituito! È possibile aggiungere la stringa da l'array in viewDidLoad del primo controller della vista e chiamare

[self.tableView reloadData]; 

e dovrebbe funzionare.

+1

Solo un'aggiunta, dove si inizializza il secondo controller di visualizzazione nel primo, fare: secondView.myDelegate = self; – hyd00

+0

gg13, grazie! La domanda per la tua risposta dovrebbe essere chiamata "Come creare facilmente delegati". Mi sentivo confuso, e ora nemmeno cercandolo, li capisco. –

+0

grazie ... molto ... –