从自定义UISplitview导航回来

时间:2013-01-25 12:38:09

标签: ios xcode ios6 xcode4.5 uisplitviewcontroller

在我的iPad应用程序中,我有一个主菜单屏幕..上面有各种图标。

点击图标后,它会导航到Custom UISplitViewController。我用这段代码做了。在SplitView中一切正常。

问题:点击MASTER Viewcontroller导航栏中的按钮,我回到主菜单屏幕时遇到问题。

自定义UIsplitview的

代码: -

self.navigationController.navigationBarHidden = NO;
self.navigationController.navigationBar.barStyle = UIBarStyleBlack;

left = [[LeftViewController alloc] initWithStyle:UITableViewStylePlain];
UINavigationController *leftNav = [[UINavigationController alloc] initWithRootViewController:left];
right = [[RightViewController alloc] initWithNibName:@"RightViewController" bundle:nil];
UINavigationController *rightNav = [[UINavigationController alloc] initWithRootViewController:right];
left.right = right;

splitViewController = [[UISplitViewController alloc] init];    
splitViewController.viewControllers = [NSArray arrayWithObjects:leftNav,rightNav, nil];

splitViewController.delegate = right;

appDelegate = (AppDelegate *)[[UIApplication sharedApplication]delegate];
UISplitViewController *cvc = (UISplitViewController *) splitViewController;
[appDelegate.window setRootViewController:cvc];

编辑:自定义按钮代码

UIButton *a1 = [UIButton buttonWithType:UIButtonTypeCustom];
[a1 setFrame:CGRectMake(0.0f, 0.0f, 32.0f, 32.0f)];
[a1 addTarget:self action:@selector(menu:) forControlEvents:UIControlEventTouchUpInside];
[a1 setImage:[UIImage imageNamed:@"icon.png"] forState:UIControlStateNormal];
UIBarButtonItem *random = [[UIBarButtonItem alloc] initWithCustomView:a1];
left.navigationItem.leftBarButtonItem = random;

- (void)menu {

[self.view removeFromSuperview];
ViewController *vc = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];

[appDelegate.window setRootViewController:vc];
[vc release];

}

这会导致CRASH,带有EXC_BAD_ACCESS消息。

请指导我..

2 个答案:

答案 0 :(得分:0)

我不确定这是一个好的设计。您从主菜单屏幕床边进入拆分视图控制器还能做些什么?

如果你想保留这个设计,你会做你在发布的代码末尾做的事情 - 在按钮的动作方法中,创建一个主菜单控制器的实例并将其设置为窗口的根视图控制器。

编辑后:

我可以看到一个确定会导致崩溃的问题 - 当您创建按钮时,您将操作设置为“menu:”,但您的方法实现只是“菜单”而没有冒号或参数。删除冒号,一切都应该有效。

我不认为这三行会造成麻烦,但是没有必要做你正在做的事情:

appDelegate = (AppDelegate *)[[UIApplication sharedApplication]delegate];
UISplitViewController *cvc = (UISplitViewController *) splitViewController;
[appDelegate.window setRootViewController:cvc];

你已经有了一个属性或ivar,splitViewController,没有必要将它重新分配给cvc。此外,没有必要获得应用程序委托,您可以使用self.view.window获取窗口。所以这3行可以改为:

self.view.window.rootViewController = splitViewController;

答案 1 :(得分:0)

我假设您可以通过从断点处跳过来查看崩溃发生在代码的哪一行?

我不喜欢你的sw设计,说实话,因为我不会使用UISplitViewController子类。我更有可能使用UIViewController包含API创建自定义SplitViewController,然后将其与UINavigationController结合使用。

那就是说,如果你必须使用UISplitViewController子类,那么我建议让所有代码在appDelegate主窗口中添加或删除viewControllers,然后使用通知告诉appDelegate何时添加或删除相关的viewControllers (切换根)。这样,您可以减少将相同视图控制器的多个实例挂在主要内存问题上的可能性。尝试让viewController从它的父节点中删除它总是很棘手,并且最好由父级或更高级别的实体(在这种情况下是主应用程序委托)管理。