【问题标题】:Removing View from its superview getting a bad access error XCODE从其超级视图中删除视图得到一个错误的访问错误 XCODE
【发布时间】:2013-03-04 03:20:33
【问题描述】:

自从故事板发布以来,我已经很久没有使用 addSubview 和 removeFromSuperview 了。显然我忘记了如何使用它们。

所以在我的 UIViewControllerA 上,我有一个按钮的代码:

- (IBAction)buttonClickHandler:(id)sender {

    dyf_FacebookViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"Facebook"];
    [self.view addSubview:controller.view];

}

加载由 UIViewControllerB 处理的 UIView。现在这个视图可以被许多不同的 ViewControllers 调用为子视图,这就是为什么我让它从父视图中删除。

所以在 UIViewControllerB 我有这个代码:

- (IBAction)close:(id)sender {

     [self.view removeFromSuperview];
}

不幸的是,返回错误的访问错误。请帮忙!

谢谢

  • 迈克尔

编辑:

添加的子视图(子视图的视图控制器)将控制删除自身,因为它控制子视图上的按钮。所以我无权访问 ViewControllerA 中的原始 controller.view 变量

【问题讨论】:

  • 没有人问的问题是,如果您只是将其主视图添加到当前控制器,为什么还要实例化视图控制器?除非您有非常具体的理由这样做,否则这是一个很大的错误,并且在最近的 WWDC 会谈中已被广泛讨论。如果您正在使用视图控制器包含,您需要阅读更多关于它的信息,因为您做错了。最后,一个视图不能有两个超级视图,因此当您将 B 视图添加到 A 控制器时,B 控制器不再具有该视图集,因此当您调用它来删除视图时,会发生不好的事情。

标签: objective-c uiview


【解决方案1】:

您必须保留对 dyf_FacebookViewController 对象的引用,因此您可以执行以下操作:

- (IBAction)close:(id)sender {
    [controller.view removeFromSuperview];
}

您现在正在做的是从其父视图中删除您的主视图,这可能会产生严重后果,使您无法访问。

【讨论】:

  • 对,但就像我说的,关闭按钮代码保存在不同的 ViewController 中。所以我必须有权访问 controller.view 变量,我可以传递它吗?
  • 您可以实现委托机制,因此 UIViewControllerA 会知道何时需要关闭。你可以通过 NSNotificationCenter 做同样的事情。另外,也许你应该使用 UIViewController 容器 API 来实现更安全。
  • 我可能要设置一个代表。我不知道为什么我以前没有想到这一点。谢谢!
  • 以防万一有更好的方法来做到这一点,我现在不会投票最佳答案。我要给它一点。
【解决方案2】:
if ([controller.view superView]) {
    [controller.view removeFromSuperview];
}

【讨论】:

    【解决方案3】:

    试试这个

    - (IBAction)close:(id)sender {
    for (UIView *subView in self.view.subviews) {
        [subView removeFromSuperview];
    }
    }
    

    【讨论】:

      【解决方案4】:

      如果你想删除你添加的视图,那么保留一份视图控制器的副本...

      // in this VC.m
      @interface
      @property (nonatomic, strong) dyf_FacebookViewController *dyfController;
      @end
      
      - (IBAction)buttonClickHandler:(id)sender {
      
          self.dyfController = [self.storyboard instantiateViewControllerWithIdentifier:@"Facebook"];
          [self.view addSubview:self.dyfController.view];
      }
      

      稍后,关闭视图...

      [self.dyfController.view removeFromSuperview];
      

      【讨论】:

      • 我无法访问另一个视图控制器中的 controller.view。那么我如何将它传递给正在处理添加的视图的新视图控制器。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-26
      • 2012-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多