加载嵌入在导航中的视图控制器

Posted

技术标签:

【中文标题】加载嵌入在导航中的视图控制器【英文标题】:loading view controller embedded inside navigation 【发布时间】:2013-10-31 09:36:11 【问题描述】:

我试图在加载我的 tableView 之前创建一个加载视图控制器。这很好用。

但是,当 tableView 显示时,我得到一个后退按钮。当点击它带我回到加载视图。我猜这是因为它嵌入在导航控制器内部。请指教。

【问题讨论】:

【参考方案1】:

如果你想隐藏后退按钮,只需添加

self.navigationController.navigationBarHidden=YES;

在第三个 View 控制器的 viewDidLoad 否则添加

self.navigationItem.hidesBackButton=YES;

【讨论】:

我不想隐藏导航栏。我只是不希望后退按钮在那里。谢谢 这行得通,但我知道它不是拥有加载视图的最佳方式。【参考方案2】:

您有不同的选项可供选择,具体取决于您的需要:

加载视图可以推送导航控制器。 您可以避免使用完整的视图控制器来进行加载,而只需在“优惠视图控制器”的其余部分上方设置一个视图。 或者,如果您只想让按钮消失,请参考 Raon 的答案

【讨论】:

在“优惠视图控制器”的其余部分上方设置视图是什么意思。【参考方案3】:

导航控制器会将您推送的所有控制器保存在导航堆栈中。

因此,如果您使用导航控制器推送 ladingviewcontroller,然后推送 tableview 控制器,导航堆栈将包含两个控制器,这就是为什么在按下后退按钮时,您会被导航到 loadingViewController。

我的建议是在加载 tableview 之前删除 loadingviewcontroller 并在 tableviewcontroller 中显示加载视图。就像,在 tableviewcontroller 的 viewWillAppear 中,只需添加一个带有加载指示器的 UIView 并将其添加为 tableviewcontroller 的子视图,并在准备好显示 tableview 后将其删除。

【讨论】:

【参考方案4】:

好吧,如果你只是想隐藏后退导航栏按钮,你可以这样做

 [self.navigationController.navigationItem setHidesBackButton:YES animated:YES];

但是显示加载控制器视图的更好方法是这样,

[self.view addSubview:loadingController.view];
[loadingController willMoveToParentViewController:self];
[self addChildViewController:loadingController];
[loadingController didMoveToParentViewController:self];

当不需要加载视图时,只需将其隐藏或从superView 中删除。您甚至可以在隐藏时对其进行动画处理,以提供更好的效果。

【讨论】:

我将如何一步一步地做到这一点?【参考方案5】:

这里我们遇到了架构问题,最好的方法如下:

    使 2 和 3 视图成为一个视图。我的意思是您必须在包含表格视图的视图的中心添加 ActivityIndi​​cator。 隐藏表格视图并将startAnimating 设为UIActivityIndicatorView。 完成所有加载工作。 加载完成后,stopAnimating 你的UIActivityIndicatorView 并让表格视图再次可见。

就是这样;)

【讨论】:

你会怎么做? 把tableView和Activity指示器放在同一个视图中(控制器在中间)删除第3个视图,为Activity指示器和表格视图创建Outlets,按照步骤2,3,4 . 没什么大不了的。【参考方案6】:

不要通过navigationController推送优惠加载视图控制器,只需在viewDidLoad方法中的offersviewcontroller(第三个)上子视图它的视图:

OffersLoadViewController *offerLoadView = [[OffersLoadViewController alloc] initWithNibName:@"OffersLoadViewControllerv" bundle:nil];
[self.view addSubview: offerLoadView.view];

处理加载后将其删除:

[offerLoadView.view removeFromSuperview];

【讨论】:

这似乎是个好方法。但是当试图做 [offerLoadView removeFromSuperview];在我处理之后,我得到“'OffersLoadViewController' 没有可见的@interface 声明选择器'removeFromSuperView'” 我的错误。您应该删除FromSuperView offerLoadView.view。编辑了我的答案。 感谢错误已经消失。在运行时它抱怨它找不到包 initWithNibName:@"OffersLoadViewControllerv"。有什么想法吗? 将 offerloadviewcontroller .xib 的名称放在那里。可能是 '@"OffersLoadViewController"' 我刚刚提供了示例代码 :-) 我使用的是故事板,而不是 .xib 文件。这有关系吗?

以上是关于加载嵌入在导航中的视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

无法关闭嵌入在导航控制器中的两个视图控制器

如何导航到嵌入在标签栏控制器中的视图控制器

UIScrollView 是不是仅适用于嵌入在导航控件中的视图控制器?

视图控制器中的集合视图,单元格触摸集合视图本身的顶部边框(嵌入在导航控制器中)

以模态方式将嵌入在导航控制器中的视图控制器与标签栏控制器分开

如何从嵌入在导航控制器中的视图控制器接收信息