Сложенные модальные UIViewControllers не анимируются согласно документу? - PullRequest
1 голос
/ 30 июня 2010

Вкратце, у меня есть корневой контроллер RootController, представляющий модальный навигационный контроллер, показывающий Controller1, который сам представляет модальный навигационный контроллер, показывающий Controller2.

Я хочу одновременно закрыть Controller1 и Controller2, отправив корневому контроллеру сообщение dismissModalViewControllerAnimated :.

Я ожидал увидеть анимацию отклонения Контроллера2 (или, скорее, его контроллера навигации) и НЕ видеть Контроллер1 в процессе, возвращая меня к корневому контроллеру согласно документации:

Если вы представите несколько модальных представлений контроллеры подряд, и, таким образом, построить стек модального представления контроллеры, вызывающие этот метод на посмотреть контроллер ниже в стеке отклоняет свое непосредственное детское представление контроллер и все контроллеры представления выше этого ребенка в стеке. когда это происходит, только самый верхний вид уволен в оживленном порядке; любые промежуточные контроллеры вида просто удаляется из стека. самый верхний вид отклоняется с помощью его модальный стиль перехода, который может отличаются от стилей, используемых другими просмотр контроллеров ниже в стеке.

Однако 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 голосов
/ 12 марта 2011

Вы действительно не должны использовать такой большой стек контроллеров представления.Проблема с этим подходом состоит в том, что все эти контроллеры представления остаются в памяти до тех пор, пока вы не отмените первый, который может вызвать предупреждения памяти, если эти контроллеры становятся тяжелыми.дизайн шаблона.Поэтому в основном добавьте протокол для первого контроллера:

@protocol RootControllerDelegate

-(void) dismissModal;

@end

и присвойте свойство следующим контроллерам

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

, затем просто вызовите [self.rootdelegate dismissModal] там, где вы хотите, чтобы они исчезли.Визуально это будет выглядеть так, как будто последний контроллер исчезает.* Как работает UITabBarController?

...