ios - 从 super View iOS 中删除 View

标签 ios animation delegates viewcontroller

我很难理解为什么下面的第一种方法可以隐藏和删除 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/

相关文章:

jquery ui 自动完成与委托(delegate)

objective-c - 如何在 iPhone 应用程序中进行图像识别

javascript - Fadeout 不褪色,只是消失

swift - 如何从 Swift 中另一个类中的监听器调用 SKScene 中的方法?

java - Android动画的简单线程问题

c# - 使用 WPF 动画淡出任何控件

c# - 在 Silverlight 中同步操作

ios - 在 Swift 中从 json 文件读回数据的正确方法是什么?

ios - 单点触控 : pause application unit dialog response

iphone - 如何以编程方式捕获 iPhone 控制台日志?