如何在两个视图之间的转换中处理旧控制器?

时间:2011-03-15 09:41:00

标签: iphone uiview uiviewcontroller

我正在尝试使用他们的控制器在两个视图之间创建转换。问题是,过渡动画结束后如何处理旧控制器?在动画完成之前我无法处理它,因为这会导致分段错误 - 显然所涉及的动画不会增加它们使用的视图的保留计数。

我唯一能想到的是提供一个动画完成后调用的方法来释放控制器参数。我希望有人会有一个更优雅的解决方案。

以下是我的根视图控制器中方法的示例代码:

-(void) switchToController:(UIViewController *) controller {
    [controller viewWillAppear:YES];

    if (self.currentScreenController != nil) {
        [self.currentScreenController viewWillDisappear:YES];
        [[self.currentScreenController view] removeFromSuperview];
    }

    [self.view addSubview:[controller view]];

    if (self.currentScreenController != nil) {
        [self.currentScreenController viewDidDisappear:YES];
    }

    self.currentScreenController = controller;

    [controller viewDidAppear:YES];

    //[controller release]; // <- releasing now will cause errors as subsequent animations reference this controller's view
    ...
    // animations start now

[编辑] 好吧,即使在动画完成后出于某些无法解释的原因,我也似乎无法释放控制器。几秒钟后我安排了NSTimer电话 动画完成后,我会在发布之前检查保留计数是否为1 当我发布它时,我遇到了崩溃。这是计时器调用以释放的方法 已经未使用的控制器:

- (void) releaseOldController {
    @synchronized(arrayOfOldControllers) {
    if (2 < [arrayOfOldControllers count]) {
        NSObject * object = [arrayOfOldControllers objectAtIndex:0];
        [arrayOfOldControllers removeObjectAtIndex:0];
        NSLog(@"releasing object (%@) with retain count(%d)", object, [object retainCount]);
        [object release];
    }
}

}

也许我的策略是错误的。我想要完成的是模拟书页 转折点。这本书有30多页,我想尽快处理旧页面 完成向新页面的转换以释放内存。所以当用户转向时 在新页面中,创建具有新视图的新控制器并将其添加到根控制器 具有约1/2秒的淡入淡出动画过渡。一旦动画结束 我想释放上一页面视图,因为只有新的页面视图可见。这条路 根控制器视图在任何时候最多有2个子视图,通常只有1 - 转换完成后查看的当前页面。这应该不是那么难做,但是我不明白为什么在释放控制器时不再使用它时会出现错误。

[更新]这个问题是错的 - 问题出在其他地方,与控制器或视图无关。上面的代码是正确的。

2 个答案:

答案 0 :(得分:0)

提供动画完成的回调方法肯定会起作用,但它有点烦人。

您可以使用的更好的技术:如果您的目标是iOS4及以后的版本,您可以使用动画块 - 请参阅iPhone UIView Animation Best Practice - 特别是,completion:位允许您指定在动画结束时会发生什么,而不必以通常的方式定义新的回调方法。

答案 1 :(得分:0)

如果您正在尝试模拟翻页,我会将所有控制器加载到NSMutableArray并将其用作我的页面指南。您可以在将它们添加到阵列后释放所有UIViewControllers,然后只要您想要返回,您仍然可以访问它们。