Iphone 为什么这会有所不同;“添加子视图”;代码导致行为上的差异
为什么将下面的代码从旧条目更改为新条目可以解决以下问题 代码: 使用旧代码时出现问题:Iphone 为什么这会有所不同;“添加子视图”;代码导致行为上的差异,iphone,ios,uinavigationcontroller,uitableview,Iphone,Ios,Uinavigationcontroller,Uitableview,为什么将下面的代码从旧条目更改为新条目可以解决以下问题 代码: 使用旧代码时出现问题: 我使用的是一个UINavigationController,有一个“mainView”UITableViewController,然后是一个推到堆栈上的第二级视图,我们称之为“detailedView”UITableViewController 正常地从主视图到细节视图来回导航效果良好 但是,当启动时自动启动进入第二个视图时(当我保存状态时),我会进入第二个视图OK,但是在这种情况下,工具栏按钮不会出现在第
- 我使用的是一个UINavigationController,有一个“mainView”UITableViewController,然后是一个推到堆栈上的第二级视图,我们称之为“detailedView”UITableViewController
- 正常地从主视图到细节视图来回导航效果良好
- 但是,当启动时自动启动进入第二个视图时(当我保存状态时),我会进入第二个视图OK,但是在这种情况下,工具栏按钮不会出现在第二个视图的底部。当我返回主页面(通过UINavigationController标准排列),然后在UITableView中选择行,然后再次返回到同一视图时,工具栏项目显示良好
- 无法追踪到这一点,但最终通过反复试验,我注意到appDelegate(所有地方)中的代码(见上文)变化似乎解决了这个问题
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;
有什么想法吗
编辑:为了完整起见,这里是完整的方法
- (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文件,并且在interface builder中设置了根视图控制器/窗口-所以我想知道我是否在这里混合了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;
这两种方法的区别在于,一种方法触发视图生命周期方法,而另一种方法不触发 例如,设置
窗口。rootViewController
将导致旧视图控制器接收消息:ViewDidDisPaper viewWillDissapear等。。而新的视图控制器将接收viewWillApear、VIEWDID等
addSubview:
不执行此操作
这有用吗
编辑:
详细阅读您的帖子看起来您是在详细视图的viewdide
方法上以编程方式添加按钮
从4.0开始,添加了UIWindow
的rootViewController
属性。文档中没有明确提到它将触发视图生命周期方法,我和您一样通过跟踪和错误发现了这一点。(也许有人可以针对苹果的文档提出问题)
如果需要向后兼容3.x,可以使用自定义UIWindow子类。我的代码如下。使用window.djRootViewController=yourViewController
而不是window.rootViewController
。它是为在Interface builder中使用而设计的
#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
#导入
@界面窗口:UIWindow{
UINavigationController*m_导航控制器;
}
@属性(非原子,保留)UIViewController*djRootViewController;
@结束
#导入“DJWindow.h”
@接口窗口()
-(无效)customInit;
@结束
@实现窗口
-(id)initWithCoder:(NSCoder*)编码器{
self=[super initWithCoder:coder];
如果(自我){
[自定义初始化];
}
回归自我;
}
-(void)customInit{
m_navigationController=[[UINavigationController alloc]init];
m_navigationController.navigationBarHidden=是;
[自添加子视图:m_navigationController.view];
}
-(void)setRootViewController:(UIViewController*)rootViewController{
NSLog(@“错误,不要设置rootViewController属性,改用djRootViewController”);
}
-(void)setDjRootViewController:(UIViewController*)djRootViewController{
if(djRootViewController==nil){
[m_navigationController SetViewController:nil];
}否则{
NSArray*vcArray=[NSArray arrayWithObject:djRootViewController];
[m_navigationController SetViewController:vcArray];
}
}
-(UIViewController*)djRootViewController{
返回m_navigationController.visibleViewController;
}
-(无效)解除锁定
{
[m_navigationController发布];
[super dealoc];
}
@结束
嗨,罗伯特-我不得不承认,这对我来说没有什么意义。你在哪里找到你在这里提到的信息?(例如,可能在苹果指南中?)。事实上,哪一种方法是正确的?我注意到Apple UITableView指南中提到了使用“addSubView)方法…即。在我在最初的帖子中也更新了我的完整方法。哦,我确实有一个NIB文件,并且在interface builder中设置了根视图控制器/窗口-所以我想知道我是否在这里混合了NIB和编程方法,这可能会导致问题?重新启动时如何导航到第二个视图控制器?