为什么将以下代码从旧条目更改为新条目可以修复以下问题。
Code:
// OLD Entry - Did not work
//[self.window addSubview:navigationController.view];
// NEW Entry - Fixed it
self.window.rootViewController = self.navigationController;
当我使用旧代码时出现问题:
我正在使用 UINavigationController 并有一个“mainView”UITableViewController,然后将第二级视图推入堆栈,我们将其称为“detailedView”UITableViewController。
通常从主要内容到详细信息来回导航效果很好
但是,当启动时自动启动到第二个视图(当我保存状态)时,我可以正常进入第二个视图,但是在这种情况下,工具栏按钮不会出现在第二个视图的底部。当我返回主页(通过 UINavigationController 标准安排),然后选择 UITableView 中的行,并再次返回同一视图时,工具栏项目显示正常。
无法追踪到这一点,但最终通过反复试验,我注意到 appDelegate(所有地方)中的代码更改(见上文)似乎解决了该问题。
有任何想法吗?
编辑:为了完整性,这里是完整的方法
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
RootViewController *rootViewController = (RootViewController *)[navigationController topViewController];
NSManagedObjectContext *context = [self managedObjectContext];
if (!context) {
abort(); // TODO: Do better job here than abort
}
rootViewController.managedObjectContext = context;
self.window.rootViewController = self.navigationController;
[self.window makeKeyAndVisible];
return YES;
}
编辑2:哦,我确实有一个NIB文件,并且在界面生成器中设置了根视图控制器/窗口 - 所以我想知道我是否在这里混合NIB和编程方法,这可能会导致问题?
编辑3:还注意到,当我添加“self.window.rootViewController = self.navigationController”行时,以下 didFinishLaunchingWithOptions 代码有效。如果没有这一行(这就是 coredatabooks 示例所做的),我就会遇到问题。
RootViewController *rootViewController = (RootViewController *)[navigationController topViewController];
rootViewController.managedObjectContext = self.managedObjectContext;
self.window.rootViewController = self.navigationController; // WORKS WHEN I ADD THIS LINE IN FOR SOME REASON???
// Configure and show the window
[window addSubview:[navigationController view]];
[window makeKeyAndVisible];
return YES;
两种方法之间的区别在于,一种方法触发视图生命周期方法,另一种则不触发。
IE。环境window.rootViewController
将导致旧视图控制器接收消息:viewDidDisappear viewWillDisappear等。而新视图控制器将接收viewWillApear,viewDidAppear等。
addSubview:
不这样做。
这有帮助吗?
EDIT:
详细阅读您的帖子,看起来您正在以编程方式在viewDidAppear
详细视图的方法。
The rootViewController
的财产UIWindow
从 4.0 开始添加。文档没有明确提到它将触发视图生命周期方法,我通过像你一样的跟踪和错误发现了这一点。 (也许有人可以针对苹果文档提出问题)。
如果您需要向后兼容 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)