堆叠的模态UIViewControllers不按照doc进行动画制作?

时间:2010-06-29 21:18:51

标签: iphone uiviewcontroller modal-dialog

简而言之,我有一个根控制器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

感谢您帮助我找到解决此问题的方法。

1 个答案:

答案 0 :(得分:0)

你真的不应该使用这么大的一组viewcontrollers。这种方法的问题在于,所有那些视图控制器都会保留在内存中,直到您关闭第一个视图控制器,如果这些控制器变重,可能会导致内存警告。

如果您仍想使用该方法,我建议使用委托设计模式。所以基本上为第一个控制器添加一个协议:

@protocol RootControllerDelegate

-(void) dismissModal;

@end

并将属性分配给下一个控制器

@property (nonatomic, assign) id <RootControllerDelegate> rootdelegate;

然后只需拨打[self.rootdelegate dismissModal]您希望它们消失的地方。这在视觉上看起来只有最后一个控制器消失了动画。

更好的方法是创建一个RootViewController并将其他视图控制器添加为子视图,以便在切换时将其从内存中删除,请参阅How does UITabBarController work?