如何在两个视图之间的转换中处理旧控制器?
我试图通过使用他们的控制器在两个视图之间创建一个转换。问题是,一旦过渡动画完成后如何处置旧的控制器?在动画完成之前,我无法处理它,因为这会导致分段错误 - 显然,所涉及的动画不会增加所用视图的保留数。如何在两个视图之间的转换中处理旧控制器?
我唯一能想到的就是提供一个方法,一旦动画完成释放controller参数就被调用。我希望有人会有一个更优雅的解决方案。
这里是在我的根视图控制器的方法我的示例代码:
-(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个 - 在转换完成后查看当前页面。这不应该这么难,但是我不明白为什么当它不再使用时释放控制器时出现错误。
[更新]这个问题是错误的 - 问题在别的地方,与控制器或视图无关。上面的代码是正确的。
提供动画完成回调方法肯定会奏效,但有点烦人。
一种更好的技术可供您使用:如果您只定位iOS4及以上版本,则可以使用动画块 - 请参阅iPhone UIView Animation Best Practice - 特别是,completion:
位允许您指定在结束时发生了什么动画,而不必以通常的方式定义新的回调方法。
我现在试图让它向后兼容3.0 – andrewz 2011-03-15 18:24:21
如果您试图模拟翻页,我会将所有控制器加载到NSMutableArray中,并将其用作我的页面指南。您可以在将所有UIViewControllers添加到数组之后释放所有UIViewControllers,然后当您想要返回时您仍然可以访问它们。
可以显示完整的代码吗?你有没有从你的示例代码中删除一些动画块的东西? – occulus 2011-03-15 09:43:52
在您的示例代码中,注释掉的[[controller release]]实际上是释放新控制器,而不是旧控制器?我期望旧的控制器正在被释放:'self.currentScreenController = controller' – 2011-03-15 09:47:24
@occulus在此方法结束时创建并调用了CATransition动画。我在[self.view.superview图层]上调用它,它是屏幕窗口的一个图层。 – andrewz 2011-03-15 18:21:15