UIViewController无法卸载

时间:2012-04-21 20:00:54

标签: ios uiviewcontroller uitabbarcontroller

自从我开始学习iOS程序(2012年2月)以来,我一直在研究这个问题。我在这里看了很多帖子似乎都在问同样的问题,我试图将答案应用到我的应用程序中无济于事。我确信我错过了一些简单的事情。

我有一个视图切换测试应用程序。有三种观点:橙色,蓝色,黄色。它从带有两个按钮的橙色视图开始 - 切换到蓝色视图并切换到黄色视图。当我点击切换到黄色视图时 - 视图将在白色背景下旋转。黄色视图还有两个按钮 - 切换到橙色视图并切换到蓝色视图。当我单击切换到橙色视图时,视图会向后翻转,但橙色视图不是白色背景,而是背景。如何让橙色视图不在那里?

这是我用来进行转换的代码:

-(IBAction)switchToYellowView:(id)sender {

YellowViewController *myViewController = [[YellowViewController alloc]
                                         initWithNibName:@"YellowViewController"
                                         bundle:nil];

[UIView beginAnimations:@"flipview" context:nil];
[UIView setAnimationDuration:2];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft 
                       forView:self.view cache:YES];

[self.view addSubview:myViewController.view];

[UIView commitAnimations];

}

根据我的阅读,我认为我需要从superview中删除橙色视图。但是当我使用

[OrangeViewController.view removeFromSuperView]

我收到错误消息“在对象OrangeViewController上找不到属性视图。”

如果我从黄色视图切换到蓝色视图,橙色视图仍在后台。然后从蓝色切换回橙色,黄色仍然在后台。

我在其他地方读到,我还需要通过添加

来释放这些视图
[myViewController release]

我提交动画后。我认为使用ARC(我正在使用)时这是不必要的。当我这样做时,尝试返回橙色视图会导致Bad Access崩溃。

也许我需要用rootViewController做些什么?我确实将OrangeView设置为app delegate.m中的“window”子视图:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

// Override point for customization after application launch.

// Add the view controller's view to the window and display.
[self.window addSubview:viewController2.view];
[self.window makeKeyAndVisible];

return YES;

}

viewController2是指向OrangeViewController的指针。

由于第一个评论,我开始四处寻找切换rootViewController - 并找到Ken Anderson的关于以编程方式切换rootviewcontroller的讲义。我可以让黄色改变,但它不是动画。

接下来的两条评论引领我走向其他方向 - 最好的方法是使用容器控制器 - 比如UITabBarController?除了使用我自己的按钮,从不显示标签栏?

我当然可以提供整个申请细读。提前谢谢!

2 个答案:

答案 0 :(得分:1)

尝试使用:

[self transitionFromViewController:currentViewController toViewController:firstViewNav duration: options: animations:^{
        } completion:^(BOOL finished){

        }];

答案 1 :(得分:0)

在switchToYellowView:中,您将黄色视图添加为当前视图的子视图,即橙色视图。因此,如果您尝试使用[OrangeViewController.view removeFromSuperView]删除橙色视图(由于视图不是OrangeViewController的公共属性,可能无法正常工作),那么您将删除具有黄色视图的橙色视图作为子视图,有效地从窗口中删除。我认为你想在switchToYellowView中做的事情是这样的:

[self.view removeFromSuperview]; //remove the orange view
[window addSubview:myViewController.view]; //replace it with the yellow view