1

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

首先我在 git hub 上写了一个 demo: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:]: message sent到释放的实例 0x75ade30

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

ps 开发环境是mac os x 10.8.4,xcode 4.6.3。该项目启用了 ARC。

4

2 回答 2

0

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

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

它应该工作。

于 2013-07-04T09:07:22.420 回答
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

现在您可以随心所欲地更改控制器。

于 2013-07-04T10:43:38.817 回答