【问题标题】:My ViewControllers overlap when i change between each one当我在每个视图控制器之间切换时,我的视图控制器重叠
【发布时间】:2014-03-14 18:26:36
【问题描述】:

我通常使用以下方法更改为另一个 ViewController:

如果我有 3 个 ViewController:VC1、VC2 和 VC3

例如,如果我想从 VC1 切换到 VC3,

在 VC1 文件中:

VC3 *myVC3 = [[VC3 alloc]initWithNibName:@"NibName" bundle:nil];

[self.view addSubView:myVC3.view];

当我在VC3时,如果我想去VC1,我使用:

[self.view removeFromSuperView];

然后我回到VC1。

问题是,当我有三个或更多 ViewController 并且我正在测试应用程序时,ViewController 会重叠。

例如:我们在VC1,然后我切换到VC3,当我想去VC2时,VC1出现了。 我认为这是一个实施问题。我认为这种方法对于 ViewControllers 的交换可能是错误的。

我该如何解决这个问题?我在想,但没有得到任何解决方案。

【问题讨论】:

  • 您并没有真正使用 ViewControllers。您正在使用 1 个 ViewController 并将其他 ViewControllers 视图添加到第一个。您应该考虑实现 UINavigationController,并推送/弹出 ViewControllers。
  • 试试 -presentViewController:animated:completion: 方法。
  • 最好使用 [self presentViewController...] 而不是 addSubview。然后,将 [self dimissViewController...] 移除
  • 我不想使用 NavigationController。我特别需要使用 UIButton 和方法在 ViewControllers 之间进行更改。如果你们可以给我写一些例子会很棒。
  • 而不是 removeFromSuperView 和 addsubview 你可以隐藏或显示视图。首次添加,然后显示隐藏视图。

标签: ios objective-c uiviewcontroller


【解决方案1】:

在您的情况下,您可以使用以下步骤。它可能会帮助你

1) 回到 VC1

[self.view sendSubviewToBack:vc3.view];
[self.view bringSubviewToFront:vc1.view];

2) 返回 View2 表示

[self.view sendSubviewToBack:vc1.view];
[self.view bringSubviewToFront:vc2.view];

注意:在执行此操作之前,所有视图必须位于视图层次结构中,应将其添加为 baseview 的子视图。

但这不是进行此类交换的好方法。相反,您必须使用 UINavigationController。

【讨论】:

  • 我会试试这个。我存储在这些视图中的数据消失或仍然可用¿
  • @Eladar 我找不到你。你有什么问题?
  • 例如,我用一些数据填充了 UITableView,好吗?现在,当我使用 addSubView 和 removeFromSuperView 时,TableView 中仍然有数据。我的问题是你的方法是否可行。
  • 嘿,如果要删除所有tableview数据意味着,您可以将数据源数组设置为nil并重新加载tableview数据。
  • 我的问题不是删除,而是保留数据。对不起我的英语
【解决方案2】:

根据我的建议,最好使用

[self.navigationController pushViewController:vc];

要返回,请使用

[self.navigationController popViewController];

【讨论】:

  • sendSubviewToBack: 和bringSubviewToFront: 方法有什么区别?
  • sendSubviewToBack 方法用于将视图发送到应用程序维护的整个视图层次结构中的后台,而之前添加的bringSubviewToFront 用于使视图现在可见(使其可用于前台)在视图层次结构中
  • 好吧,我能理解,但我问你的代码是做什么的?
  • 如果您的项目当时将 navigationController 作为 rootViewController,pushViewController 会将 vc 推送到 navigationController 堆栈并呈现它,而 popViewController 将从 navigationController 堆栈弹出当前视图控制器并呈现之前的控制器终于(最新)添加到navigationController栈中了
【解决方案3】:

这通常是应用程序流的一种不好的方法,但为了您的利益,您可以将这些东西替换为 addSubview: 并将 removeFromSuperview 替换为 BringSubviewToFront:(并且可能是 sendSubViewToBack:)。但再一次,这是一个错误的方法。

我建议使用 UINavigationController 来整理你的东西,如果你需要,你可以隐藏它的导航栏。

【讨论】:

  • 感谢您的回复。但我真的不需要 UINavigation,因为我使用了很多很多视图,我可以从 1 到 2 再到 3,然后我回到 1... 你明白我说的吗?使用 UINavigation,您可以从 A 到 B,然后返回 A,但我需要更多的灵活性
  • @Eldar:你听说过 UINavigationController 的方法 popToViewController:animated: 吗? BringSubviewToFront: 和 sendSubViewToBack: 对你有帮助吗?
【解决方案4】:

我建议您阅读有关视图控制器包含、层次结构和表示的基本文章。这是一个很好的起点:View Controller Basics,特别是来自 Apple 文档的 Presenting View Controllers from Other View Controllers

【讨论】:

    猜你喜欢
    • 2012-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-10
    • 1970-01-01
    • 2012-01-18
    相关资源
    最近更新 更多