0

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

在点击图标时,它会将我导航到自定义 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 消息。

请指导我..

4

2 回答 2

0

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

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

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

于 2013-01-29T10:48:49.490 回答
0

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

如果你想保持这种设计,你可以做你在发布代码末尾所做的同样的事情——在按钮的操作方法中,创建一个主菜单控制器的实例并将其设置为窗口的根视图控制器。

编辑后:

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

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

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;
于 2013-01-25T17:06:30.410 回答