涉及presentViewController的崩溃

时间:2013-07-04 08:24:13

标签: ios

在我最近的项目中,我使用presentviewController来组织视图切换。但是有一个奇怪的问题。

首先我在git hub上编写了一个演示:test present view。希望它能让问题更容易理解。

其次,我展示了我在演示中所做的事情: 1)根视图控制器是T1RootViewController,它有一个属性:     

@property (strong, nonatomic) T1TopViewController1 *top1VC;
加载时,它将T1TopViewController1添加为其唯一的子视图:     
self.top1VC = [[T1TopViewController1 alloc] initWithNibName:@"T1TopView1" bundle:nil];
[self.view addSubview:self.top1VC.view]; 

2)T1TopViewController1有一个属性:     

@property (strong, nonatomic) T1TopViewController2 *topVC2;
它还有一个按钮,按下时会显示T1TopViewController2:     
self.topVC2 = [[T1TopViewController2 alloc] initWithNibName:@"T1TopView2" bundle:nil];
[self presentViewController:self.topVC2 animated:NO completion:nil];

3)T1TopViewController2与T1TopViewController1几乎相同,只是它呈现T1TopViewController3

4)T1TopViewController3有一个按钮,按下后会返回显示T1TopViewController1:     

UIWindow *rootWin = [[UIApplication sharedApplication] keyWindow];
T1RootViewController *rootVC = (T1RootViewController *)rootWin.rootViewController;
[rootVC.top1VC dismissViewControllerAnimated:NO completion:nil];

然后从T1TopViewController1运行此应用程序,单击每个视图上的按钮,直到出现T1TopViewController3。然后单击T1TopViewController3按钮,这将返回到T1TopViewController1。然后再次单击T1TopViewController1上的按钮。现在可能会出现问题:
1)在ios 5模拟器上,一切都很好 2)在ios 6.1模拟器或设备上,它会崩溃,并带有日志:
test [699:c07] * - [T1TopViewController2 isKindOfClass:]:发送到解除分配的实例0x75ade30的消息

我真的不知道我的代码有什么问题,以及如何修复它。我会非常感谢任何帮助。

P.S。 dev环境是mac os x 10.8.4,xcode 4.6.3。该项目启用了ARC。

2 个答案:

答案 0 :(得分:0)

我不知道为什么你的代码不起作用。但我找到了一种方法来实现您在测试项目中想要做的事情。如果您将T1TopViewController3中按钮的操作更改为

- (IBAction)backBtn_onTouchUpInside:(id)sender
{
    UIViewController *presentingViewController = self.presentingViewController;
    [self dismissViewControllerAnimated:NO completion:^{
        [presentingViewController dismissViewControllerAnimated:NO completion:nil];
    }];
}

它应该有用。

答案 1 :(得分:0)

我运行你的应用程序,我看到一些奇怪的东西,你有一个UIViewController作为RootViewController然后你初始化另一个UIViewController并将他的UIView添加到RootViewController的视图。

无论如何,这就是我所做的:

您可以将AppDelegate中的代码更改为:

 T1TopViewController1 *cont = [[T1TopViewController1 alloc] initWithNibName:@"T1TopView1" bundle:nil];
 self.window.rootViewController = cont;
而不是你拥有的。

和功能:

- (IBAction)backBtn_onTouchUpInside:(id)sender
{
 UIWindow *rootWin = [[UIApplication sharedApplication] keyWindow];
[rootWin.rootViewController dismissViewControllerAnimated:NO completion:nil];
}
来自T1TopViewController3的

现在您可以根据需要更改控制器。