EDIT: Cơ chế "đúng" để thực hiện việc này trong iOS5 + sẽ sử dụng phương thức – dismissViewControllerAnimated:completion:
và trình bày trình điều khiển chế độ xem tuần tự từ khối hoàn thành.
Bộ điều khiển chế độ xem đang được hiển thị sẽ có phương thức viewDidDisappear: animated: đã hoàn thành.AFIK đây là nơi duy nhất bạn có thể móc để bắt đầu một hiện tại tiếp theoModalViewController: hoạt hình: cuộc gọi.
Tôi có một lớp mà tôi sử dụng để trình bày bộ kiểm soát chế độ xem và nó thực hiện logic mà bạn đang tìm kiếm thông qua một cuộc gọi lại đến trình điều khiển xem trình bày khi việc loại bỏ hoàn tất. Để sử dụng lớp này, chỉ cần phân bổ/init một cá thể và hiện tại bằng cách sử dụng presentViewController bình thường: animated: call. Thực hiện các phương pháp sau đây trên bộ điều khiển xem trình bày:
- (void) modalViewControllerDidDismiss:(UIViewController *)modalViewController
này sẽ được gọi cùng một lúc điều khiển xem phương thức đã biến mất, và bạn có thể trình bày một bộ điều khiển xem phương thức mới vào lúc này.
Một điều thú vị nữa - vì lớp này là chuyên môn của UINavigationController, bạn có thể định cấu hình điều hướng bật/tắt theo ý mình. Lớp này cũng có logic tích hợp để hiển thị nút gạt, như bạn muốn.
Đây là định nghĩa lớp:
@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
Và việc thực hiện lớp:
@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
và, dưới đây là cách bạn có thể sử dụng nó (trong bối cảnh của một số bộ điều khiển xem bình thường):
- (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];
}
và, đây là phương thức gọi lại loại bỏ, trình bày một bộ điều khiển chế độ xem mới:
- (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];
}
Tại sao không chỉ sử dụng trên phương thức View Controller rằng những thay đổi quan điểm của mình? Hai chế độ xem bộ điều khiển theo chế độ trong một hàng sẽ hơi khó chịu. – bpapa
Nếu chúng là "liên tiếp", hãy cân nhắc sử dụng điều hướng. –
Bạn có chắc chắn 100% rằng việc loại bỏ chế độ xem phương thức thứ nhất và mở phiên bản thứ hai đều được thực hiện trong ngữ cảnh của chuỗi chính không? – yonel