EDIT: der „richtige“ -Mechanismus dies in iOS5 + zu tun, wäre es, die – dismissViewControllerAnimated:completion:
Methode zu verwenden, und legt die sequenziellen View-Controller aus dem Abschluss-Block.
Der Viewcontroller, die modal seine viewDidDisappear haben gezeigt wird: animierte: Methode, wenn die Animation modal-Entlassung genannte abgeschlossen ist.AFIK Dies ist der einzige Ort, an dem Sie einen nachfolgenden presentModalViewController starten können: animated: call.
Ich habe eine Klasse, die ich für die Darstellung von Modal View-Controllern verwende und implementiert die Logik, nach der Sie suchen, über einen Callback zum präsentierenden View-Controller, sobald die Kündigung abgeschlossen ist. Um diese Klasse zu verwenden, weisen Sie einfach/init eine Instanz zu und präsentieren Sie sie mit dem normalen presentViewController: animated: call. Implementieren Sie die folgende Methode auf dem präsentierenden View-Controller:
- (void) modalViewControllerDidDismiss:(UIViewController *)modalViewController
Dies wird sofort die modalen View-Controller aufgerufen werden sind weg, und Sie können einen neuen modalen View-Controller zu diesem Zeitpunkt darzustellen.
Eine nette Sache auch - da diese Klasse eine Spezialisierung von UINavigationController ist, können Sie die navigationBar nach Belieben ein- und ausschalten. Die Klasse verfügt auch über eine integrierte Logik, um eine Schaltfläche zum Schließen anzuzeigen, wie Sie möchten.
Hier ist die Klassendefinition:
@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
Und die Klassenimplementierung:
@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
und hier ist, wie Sie es (im Rahmen von einigem normalen View-Controller) verwenden können:
- (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];
}
und, hier ist die Rückruf-Callback-Methode, die einen neuen modalen View-Controller präsentiert:
- (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];
}
Warum gerade nicht auf Modal-View-Controller, der seine Ansicht ändert? Zwei Modal View Controller in einer Reihe wären ein bisschen nervig. – bpapa
Wenn sie "konsekutiv" sind, sollten Sie die Navigation verwenden. –
Sind Sie 100% sicher, dass die Abwahl der 1. Modalansicht und die Eröffnung der 2. Modalität beide im Kontext des Hauptthreads durchgeführt werden? – yonel