我很难理解为什么下面的第一种方法可以隐藏和删除 View 的 subview 。在第一种方法中,我通过引用传递指针。在第二种不太通用的方法中,我有一个专为删除特定 View 而设计的委托(delegate)方法。我想使用第一种方法,因为我有几个观点我也想应用它。我应该提一下,只要在实现类中调用第一种方法,它就不会失败。当我从我希望关闭的 View Controller 中调用它时,它失败了。当第一种方法失败时,我在 removeFromSuperview 行上得到一个 EXC_BAD_ACCESS。
-(void)closeView:(UIViewController **)viewController
{
[UIView transitionWithView:self.view
duration:UINavigationControllerHideShowBarDuration
options:UIViewAnimationOptionCurveLinear
animations:^
{
[[*viewController view] setAlpha:0.0];
}
completion:^(BOOL finished)
{
[[*viewController view] removeFromSuperview];
[*viewController release], *viewController = nil;
}];
}
-(void)closeButtonClicked
{
[delegate closeView:&self];
}
//
// This method works without fail:
//
-(void)closeView
{
[UIView transitionWithView:self.view
duration:UINavigationControllerHideShowBarDuration
options:UIViewAnimationOptionCurveLinear
animations:^
{
// In this context viewController is defined in the class interface
[[viewController view] setAlpha:0.0];
}
completion:^(BOOL finished)
{
[[viewController view] removeFromSuperview];
[viewController release], viewController = nil;
}];
}
-(void)closeButtonClicked
{
[delegate closeView];
}
最佳答案
首先,根据风格指南,在这样的方法中释放 viewController 并不是一个好主意。它会让你很快陷入困境。如果此方法的调用者负责 viewController(它已完成保留),那么它也应该释放它。这可能是第一个方法在 View Controller 本身内不起作用的原因。
在第二种方法中,您没有将 viewController 作为参数传入,这意味着它需要在上下文中定义。
如果你不在这个方法中释放viewController,那么你也不需要将它的变量设置为nil,你可以简单地将它作为普通参数传递:
-(void)closeView:(UIViewController *)viewController
{
[UIView transitionWithView:self.view
duration:UINavigationControllerHideShowBarDuration
options:UIViewAnimationOptionTransitionCrossDissolve
animations:^
{
[[viewController view] removeFromSuperview];
}
completion:nil];
}
然后您将在调用站点执行此操作:
[self closeView:childViewController];
[childViewController release]; childViewController = nil;
在动画完成之前以这种方式释放 child 是安全的,因为动画 block 隐式保留从 block 引用的所有对象,包括 viewController 参数。因此,在动画 block 释放它之前,不会调用 child 的 dealloc。 这在您的第一个代码示例中不起作用,因为您传递了一个指向变量的指针。也就是说,动画 block 不知道它需要保留 child 。
顺便说一句,我不确定你为什么要设置 alpha,在上面的例子中我展示了你也可以删除动画 block 中已有的 View 。在 UIView Class Reference 中查看更多相关信息.
关于ios - 从 super View iOS 中删除 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8762701/