Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 为什么这会有所不同;“添加子视图”;代码导致行为上的差异_Iphone_Ios_Uinavigationcontroller_Uitableview - Fatal编程技术网

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和编程方法,这可能会导致问题?重新启动时如何导航到第二个视图控制器?