简而言之,我有一个根控制器RootController,它显示一个模态导航控制器,显示Controller1,它本身就是一个显示Controller2的模态导航控制器。
我想通过向根控制器发送dismissModalViewControllerAnimated:消息来同时解除Controller1和Controller2。
我希望看到Controller2的动画被解散(或者更确切地说是它的导航控制器),并且在过程中看不到Controller1,根据文档将我带回根控制器:
如果你提出几种模态视图 控制器连续,因此 建立一堆模态视图 控制器,调用此方法 查看控制器在堆栈中较低 驳回其直接的儿童观点 控制器和所有视图控制器 在堆栈上面的那个孩子。什么时候 发生这种情况,只有最顶层的视图 以动画的方式被驳回; 任何中间视图控制器 只是从堆栈中删除。该 最顶层的视图使用它被驳回 模态过渡风格,可能 与其他人使用的风格不同 查看控制器在堆栈中较低。
然而,Controller2在没有动画的情况下瞬间被解雇,我可以看到Controller1被解雇(带动画)。 这可能是我对文档的误解。如果是,有人可以帮我找到解决方案吗?
下面是一个示例代码,它将演示我的问题(删除所有多余代码,无内存管理,无错误处理......):
// AppDelegate.h:
#import <UIKit/UIKit.h>
#import "RootController.h"
@interface AppDelegate : NSObject <UIApplicationDelegate> {
IBOUTLET UIWindow *window;
RootController *rootController;
}
@end
// AppDelegate.m:
#import "AppDelegate.h"
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
rootController = [[RootController alloc] init];
[window addSubview:rootController.view];
[window makeKeyAndVisible];
return YES;
}
@end
// RootController.h:
#import <UIKit/UIKit.h>
#import "Controller1.h"
@interface RootController : UIViewController {
Controller1 *controller1;
UINavigationController *controller1navigationController;
UIButton *button;
}
@end
// RootController.m:
#import "RootController.h"
@implementation RootController
- (void)testMe:(id)target {
controller1 = [[Controller1 alloc] init];
controller1navigationController = [[UINavigationController alloc] initWithRootViewController:controller1];
[self presentModalViewController:controller1navigationController animated:YES];
}
- (void)loadView {
[super loadView];
button = [[UIButton buttonWithType:UIButtonTypeRoundedRect] retain];
[button setTitle:@"Test me" forState:UIControlStateNormal];
button.frame = CGRectMake(50, 200, 220, 50);
[button addTarget:self action:@selector(testMe:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button];
}
@end
// Controller1.h:
#import <UIKit/UIKit.h>
#import "Controller2.h"
@interface Controller1 : UIViewController {
Controller2 *controller2;
UINavigationController *controller2navigationController;
UIButton *button;
}
@end
// Controller1.m:
#import "Controller1.h"
@implementation Controller1
- (void)testMe:(id)target {
controller2 = [[Controller2 alloc] init];
controller2navigationController = [[UINavigationController alloc] initWithRootViewController:controller2];
[self presentModalViewController:controller2navigationController animated:YES];
}
- (void)loadView {
[super loadView];
button = [[UIButton buttonWithType:UIButtonTypeRoundedRect] retain];
[button setTitle:@"Test me 1" forState:UIControlStateNormal];
button.frame = CGRectMake(50, 156, 220, 50);
[button addTarget:self action:@selector(testMe:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button];
self.view.backgroundColor = [UIColor greenColor];
}
@end
// Controller2.h:
#import <UIKit/UIKit.h>
@interface Controller2 : UIViewController {
UIButton *button;
}
@end
// Controller2.m:
#import "Controller2.h"
@implementation Controller2
- (void)testMe:(id)target {
[self.parentViewController.parentViewController.parentViewController dismissModalViewControllerAnimated:YES];
}
- (void)loadView {
[super loadView];
button = [[UIButton buttonWithType:UIButtonTypeRoundedRect] retain];
[button setTitle:@"Test me 2" forState:UIControlStateNormal];
button.frame = CGRectMake(50, 156, 220, 50);
[button addTarget:self action:@selector(testMe:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button];
self.view.backgroundColor = [UIColor redColor];
}
@end
感谢您帮助我找到解决此问题的方法。
答案 0 :(得分:0)
你真的不应该使用这么大的一组viewcontrollers。这种方法的问题在于,所有那些视图控制器都会保留在内存中,直到您关闭第一个视图控制器,如果这些控制器变重,可能会导致内存警告。
如果您仍想使用该方法,我建议使用委托设计模式。所以基本上为第一个控制器添加一个协议:
@protocol RootControllerDelegate
-(void) dismissModal;
@end
并将属性分配给下一个控制器
@property (nonatomic, assign) id <RootControllerDelegate> rootdelegate;
然后只需拨打[self.rootdelegate dismissModal]
您希望它们消失的地方。这在视觉上看起来只有最后一个控制器消失了动画。
更好的方法是创建一个RootViewController并将其他视图控制器添加为子视图,以便在切换时将其从内存中删除,请参阅How does UITabBarController work?