11

Nella mia app iOS, un utente può selezionare un'immagine da un elenco, in cui viene presentata una modale che contiene l'immagine e le opzioni per eliminare l'immagine. Se l'utente sceglie di eliminare l'immagine, viene restituita alla viewController originale contenente l'elenco di immagini. Devo quindi aggiornare il ViewController originale per tenere conto dell'immagine cancellata.Aggiornamento padre ViewController dopo aver eliminato ModalViewController

Ho provato a utilizzare NSNotificationCenter per trasmettere quando un'immagine viene eliminata sul controller di visualizzazione padre. Tuttavia, sembra che la trasmissione non sia mai stata ricevuta.

C'è qualche altro modo per

  1. dati rimando al genitore ViewController dopo il modal è respinto, e
  2. rilevare quando il modal è respinto dal genitore ViewController?

(ho provato seguendo l'esempio delineato here, ma non sembra funzionare)

Qui di seguito è il mio codice:

EditStepViewController (originale View Controller):

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; 
MediaPreviewViewController *mediaPreviewVC = (MediaPreviewViewController *)[storyboard instantiateViewControllerWithIdentifier:@"MediaPreviewViewController"]; 
mediaPreviewVC.selectedImageURL = [NSString stringWithFormat:@"%@",gestureRecognizer.view.tag]; 
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:mediaPreviewVC]; 
[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(didDismissMediaPreview) 
              name:@"MediaPreviewDismissed" 
              object:nil]; 
[self presentViewController:navigationController animated:YES completion:nil]; 

MediaPreviewViewController (secondo ViewController):

... 
[self deleteImage]; 
[[NSNotificationCenter defaultCenter] postNotificationName:@"MediaPreviewDismissed" object:nil userInfo:nil]; 
[self dismissViewControllerAnimated:YES completion:^(){ 
    NSLog(@"dismissed controller"); 
    }]; 

Poi, di nuovo in EditStepViewController:

-(void)didDismissMediaPreview{ 
    NSLog(@"dismissed media preview"); // this is never logged! 
    [self.view setNeedsDisplay]; // refresh view to account for deleted image 
} 

Grazie in anticipo per il vostro aiuto!

+0

Puoi mostrarmi dove hai aggiunto l'osservatore nella vostra editStepViewController –

risposta

19

Nel mio caso di solito uso il blocco qui.

Per esempio avete ParentViewController.h

@interface ParentViewController : UIViewController 
@end 

Attuazione ParentViewController.m

// INCLUDE HERE THE MODAL CONTROLLER TO HAVE ACCESS TO ITS PUBLIC PROPERTY 
#import ModalViewController.h 

@implementation ParentViewController 

// implement your modal dismiss block here 
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    // DEFINE HERE THE CALLBACK FUNCTION 
    // 1. get the model view controller 
    ModalViewController *mvc = [segue destinationViewController]; 

    // 2. Your code after the modal view dismisses 
    mvc.onDismiss = ^(UIViewController *sender, NSObject *objectFromModalViewController) 
    { 
     // Do your stuff after dismissing the modal view controller 
     . 
     . 
     . 
    } 
} 
@end 

E, ModalViewController.h

@interface ModalViewController : UIViewController 

// call back function, a block 
@property (nonatomic, strong) void (^onDismiss)(UIViewController *sender, NSObject *objectYouWantToPassBackToParentController) 
@end 

ModalViewController.m

@implementation ModalViewController 

. 
. 
. 

// your dismiss function say 
- (IBAction)dismissViewController:(id)sender 
{ 
    ... 

    [self deleteImage]; 

    [self dismissViewControllerAnimated:YES completion:^ 
    { 
     // MAKE THIS CALL 
     self.onDismiss(self, theOjectYouWantToPassBackToParentVC); 
    }]; 
} 
@end 
+0

grazie, questo ha funzionato per me! – scientiffic

+0

grazie. ha funzionato come un fascino. – Saraz

1

Si dovrebbe fare un protocollo in MediaPreviewViewController. Quindi, quando l'immagine viene eliminata, inviare un metodo delegato in modo che il controllore viewc padre possa gestirlo.

Inoltre non si dovrebbe mai lasciare che il viewcontroller si congegni da solo (anche se è possibile, ma si raccomanda che la vista che ha creato il modal sia anche responsabile della rimozione del modale ...)

così si dovrebbe ottenere qualcosa di simile:

In MediaPreviewViewController.h:

@protocol MediaPreviewViewControllerDelegate <NSObject> 

-(void)didRemovedImage; 

@end 

@interface MediaPreviewViewController : NSObject { 
    id<MediaPreviewViewControllerDelegate> delegate; 
} 

@property (nonatomic, assign) id < MediaPreviewViewControllerDelegate> delegate; 

In MediaPreviewViewController.m:

@synthesize delegate = _delegate; 

Poi, nel tuo metodo nella MediaPreviewViewController in cui si rimuovere l'immagine, basta chiamare:

[_delegate didRemoveImage]; 

Nella tua viewcontroller genitore, è necessario implementare questo protocollo, come si è abituati a con i delegati .. È quindi possibile rimuovere anche la vista dal genitore in questo metodo delegato

1

Questo può aiutare tutti coloro che hanno lo stesso problema su UIPopovePresentationController. Dalla mia esperienza, la risposta di Allan può risolvere lo stesso problema.

Ho appena avuto problemi con il delegato di Viewcontroller che si presenta come UIPopoverPresentingController non ha inviato la chiamata alla sua visualizzazione root. E la risposta di Allan può risolvere questo problema.

mio codice di esempio:

-(IBAction)choosePic:(id)sender 
{ 
    UIButton *picButton = (UIButton *)sender; 

    // Set PopoverPresentation view controller 

    PicViewController *picVC = [self.storyboard instantiateViewControllerWithIdentifier:@"PicViewController"]; 

    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:picVC]; 

    picVC.preferredContentSize = CGSizeMake(500., 500.); 


    // Set this function as described in Allan's answer 

    picVC.dismissPopover = ^(UIViewController *controller, UIImage *image) 
    { 

     _myImage = image; 

     ..... 

     ..... 

     ..... 

    }; 

    navController.modalPresentationStyle = UIModalPresentationPopover; 

    _picPopover = navController.popoverPresentationController; 

    _picPopover.delegate = self; 

    _picPopover.sourceView = self.view; 

    _picPopover.sourceRect = [picButton frame]; 

    navController.modalPresentationStyle = UIModalPresentationPopover; 

    navController.navigationBarHidden = YES; 

    [self presentViewController:navController animated:YES completion:nil]; 

}