EDIT: Il meccanismo "corretta" per fare questo in iOS5 + sarebbe quella di utilizzare il metodo – dismissViewControllerAnimated:completion:
, e presenta al controllore vista sequenziale dal blocco completamento.
Il viewcontroller che viene mostrato modale avrà il suo viewDidDisappear: animato: metodo chiamato una volta modale-rigetto-animazione è completa.AFIK questo è l'unico posto che puoi collegare per avviare un successivo presentModalViewController: animated: call.
Ho una classe che uso per presentare i controllori di visualizzazione modali e implementa la logica che stai cercando tramite una richiamata al controller di visualizzazione presentando una volta che il licenziamento è completo. Per utilizzare questa classe, basta allocare/avviare un'istanza e presentarla utilizzando il normale presentViewController: animato: chiamata. Implementare il seguente metodo sul controller della vista presentazione:
- (void) modalViewControllerDidDismiss:(UIViewController *)modalViewController
Questo sarà chiamato immediatamente il controller di vista modale è andato, ed è possibile presentare un nuovo controller di vista modale in questo momento.
Una cosa bella - poiché questa classe è una specializzazione di UINavigationController, puoi configurare la barra di navigazione on/off come preferisci. La classe ha anche una logica incorporata per mostrare un pulsante di espulsione, come preferisci.
Ecco la definizione della classe:
@protocol TSModalViewControllerDelegate
- (void) modalViewControllerDidDismiss: (UIViewController*) modalViewController;
@end
@interface TSModalViewController : UINavigationController
{
UIViewController* _originalParentViewController;
}
@property BOOL dismissButtonHidden;
- (id) initWithViewController: (UIViewController*) vc;
- (id) initWithClass: (Class) c;
- (id) initWithClass: (Class) c nibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil;
@end
E l'implementazione della classe:
@implementation TSModalViewController
@synthesize dismissButtonHidden;
- (id) initWithViewController: (UIViewController *)vc
{
return [super initWithRootViewController: vc];
}
- (id) initWithClass:(Class)c
{
UIViewController* vc = [[[c alloc] init] autorelease];
return [self initWithViewController: vc];
}
- (id) initWithClass: (Class) c nibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
UIViewController* vc = [[[c alloc] initWithNibName:nibNameOrNil bundle:nibBundleOrNil] autorelease];
return [self initWithViewController: vc];
}
- (void) viewDidAppear: (BOOL) animated
{
[super viewDidAppear: animated];
[_originalParentViewController release];
_originalParentViewController = [self.parentViewController retain];
if (!self.dismissButtonHidden)
{
UIBarButtonItem* dismissButton = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem: UIBarButtonSystemItemStop
target: self
action: @selector(onDismiss:)] autorelease];
UIViewController* rootViewController = [self.viewControllers objectAtIndex:0];
rootViewController.navigationItem.leftBarButtonItem = dismissButton;
self.navigationBarHidden = NO;
}
}
- (void) viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear: animated];
if ([_originalParentViewController respondsToSelector: @selector(modalViewControllerDidDismiss:)])
{
[_originalParentViewController performSelector: @selector(modalViewControllerDidDismiss:) withObject: self];
}
}
- (void) dismissModalViewControllerAnimated:(BOOL)animated
{
return [self.parentViewController dismissModalViewControllerAnimated: animated];
}
- (void) onDismiss: (id) sender
{
[self.parentViewController dismissModalViewControllerAnimated: YES];
}
- (void) didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
}
- (void) viewDidUnload
{
[super viewDidUnload];
}
- (void)dealloc
{
[_originalParentViewController release];
[super dealloc];
}
@end
e, ecco come si può utilizzare (nel contesto di qualche normale controller della vista):
- (void) onShowIt:(id)sender
{
TSModalViewController* mvc = [[[TSModalViewController alloc] initWithClass: [MyModalViewController class] nibName: @"MyModalViewController" bundle:nil] autorelease];
mvc.dismissButtonHidden = YES; // set to no if you don't want an "automatic" close button
[self presentModalViewController: mvc animated: YES];
}
e, ecco il metodo callback di licenziamento, che presenta un nuovo controller di visualizzazione modale:
- (void) modalViewControllerDidDismiss:(UIViewController *)modalViewController
{
MyModalViewController* vc = [[[MyModalViewController alloc] initWithNibName: @"MyModalViewController" bundle:nil] autorelease];
vc.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
TSModalViewController* mvc = [[[TSModalViewController alloc] initWithViewController: vc] autorelease];
[self presentModalViewController: mvc animated: YES];
}
Perché non usare modale View Controller che cambia il suo punto di vista? Due controller modali in fila sarebbero un po 'fastidiosi. – bpapa
Se sono "consecutivi", considera l'utilizzo della navigazione. –
Sei sicuro al 100% che le revisioni della prima vista modale e l'apertura della seconda sono entrambe eseguite nel contesto della discussione principale? – yonel