【问题标题】:remove view from super view from otherclass从另一个类的超级视图中删除视图
【发布时间】:2015-01-26 00:56:09
【问题描述】:

您好,我有三个视图控制器。 A,B,C 首先我在 A 下添加 B 然后在 B 下添加 C B 我正在使用以下代码

[self.view removeFromSuperview];

我可以通过单击按钮从 B 中删除 C。但是我怎样才能从 C ViewController 类的 A 中删除 B。因此,在单击 C 视图控制器中的按钮后,B、C 都必须被移除,并且只有 A 应该是可见的。

提前致谢。

【问题讨论】:

  • 将 B 添加到 A 和 C 到 B 意味着将这些控制器的视图添加到相关的视图控制器视图中。确保您没有推送控制器。

标签: ios objective-c iphone ipad uiviewcontroller


【解决方案1】:

UIView 有一个属性superview,所以你可以打电话。

[self.view.superview removeFromSuperview];

请务必阅读文档:UIView

编辑:请记住,由于视图 C 是视图 B 的子视图,因此此代码将从 A 中删除 C 和 B。

【讨论】:

  • 如果 C 的父视图是 B,而 B 的父视图是 A,那么在 C 中调用 self.view.superview 应该会得到对 B 的引用。调用 self.view.superview.superview 应该会得到对 A 的引用等
  • 我在 C 类中使用 self.view.superview removefromsuperview 从 A 中删除 B
  • 好的,我刚刚在一个我正在开发的 iOS 项目中进行了实验,它运行良好。确保self.view.superview != nil;
  • 我建议不要从外部操纵另一个视图控制器的视图层次结构。相反,我会向父视图控制器 (A) 添加一个协议/消息,要求它删除 B。从 OO 的角度来看更清晰。
  • 使用这种方法会出现什么问题?
【解决方案2】:

您需要在 C 和 B 或 C 和 A 之间建立某种依赖关系。简单地说,C 需要通知 B 应该将其从其父视图中删除,或者 A 需要通知它应该删除其子视图 B。

您可以通过协议或通知来实现这一点

【讨论】:

  • 这对于一个简单的任务来说有点过于复杂了。
  • RASS 解决方案既简单又优雅。使用那个
【解决方案3】:

您应该使用委托。 C是一个父视图是B的视图,所以B是关闭C的视图更正确,对于B也是如此,A必须是关闭B的视图。

为此,您必须在 C 中实现一个协议,在 B 中实现另一个协议,如下所示:

@protocol ViewControllerCDelegate <NSObject>

    - (void)didSelectCloseViewC;

@end

并且视图B必须实现这个协议,并且在这个方法中你必须关闭视图C。像这样:

- (void)didSelectCloseViewC {
       [self.viewC removeFromSuperView];
}

你必须对视图 B 和 A 重复这个过程,视图 B 将有它的协议,视图 A 将实现它。所以在之前的方法 didSelectCloseViewC 中你最终会得到这个:

- (void)didSelectCloseViewC {
       [self.viewC removeFromSuperView];
       [self.delegate didSelecCloseViewB];
}

在视图 A 中,您将像这样实现视图 B 协议:

- (void)didSelectCloseViewB {
       [self.viewB removeFromSuperView];
}

【讨论】:

    猜你喜欢
    • 2012-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多