Разница между этими двумя методами заключается в том, что один запускает методы жизненного цикла представления, а другой - нет.
Т.е. установка window.rootViewController
приведет к тому, что старый контроллер представления получит сообщения: viewDidDissaper viewWillDissapear и т. Д., В то время какновый контроллер представления получит viewWillApear, viewDidAppear и т. д.
addSubview:
не делает этого.
Помогает ли это?
РЕДАКТИРОВАТЬ:
При подробном чтении вашего поста создается впечатление, что вы добавляете кнопки программно в методе viewDidAppear
подробного просмотра.
Свойство rootViewController
UIWindow
было добавлено как4.0.В документации явно не упоминается, что это вызовет методы жизненного цикла представления, я узнал об этом через ошибки и следы, как и вы.(возможно, кто-то может поднять проблему в отношении документации Apple).
Если вам нужна обратная совместимость с 3.x, вы можете использовать этот пользовательский подкласс UIWindow.Мой код ниже.используйте window.djRootViewController = yourViewController
вместо window.rootViewController
.Он предназначен для использования в Интерфейсном конструкторе.
#import <UIKit/UIKit.h>
@interface DJWindow : UIWindow {
UINavigationController* m_navigationController;
}
@property (nonatomic, retain) UIViewController* djRootViewController;
@end
#import "DJWindow.h"
@interface DJWindow()
- (void) customInit;
@end
@implementation DJWindow
- (id) initWithCoder:(NSCoder *)coder {
self = [super initWithCoder:coder];
if (self) {
[self customInit];
}
return self;
}
- (void) customInit {
m_navigationController = [[UINavigationController alloc] init];
m_navigationController.navigationBarHidden = YES;
[self addSubview:m_navigationController.view];
}
- (void) setRootViewController:(UIViewController *)rootViewController {
NSLog(@"ERROR, do not set the rootViewController property, use djRootViewController instead");
}
- (void) setDjRootViewController:(UIViewController *)djRootViewController {
if (djRootViewController == nil) {
[m_navigationController setViewControllers:nil];
} else {
NSArray* vcArray = [NSArray arrayWithObject:djRootViewController];
[m_navigationController setViewControllers:vcArray];
}
}
- (UIViewController*) djRootViewController {
return m_navigationController.visibleViewController;
}
- (void)dealloc
{
[m_navigationController release];
[super dealloc];
}
@end