没有使用导航控制器切换视图控制器

5
我确定这个问题已经被问了无数次,虽然我看到过类似的问题,但答案仍然让我困惑。
我有一个带有多个视图控制器的应用程序,每个好的视图控制器都会完成自己的任务。然而,我发现自己陷入了困境,无法从一个视图控制器切换到另一个视图控制器。我看到很多人说“使用导航控制器”,但由于与视图控制器相关的不需要的视图元素,我不想使用它。
我已经尝试了以下方法并取得了有限的成功。视图控制器已经切换,但视图没有加载,我得到了一个空视图:
- (IBAction)showLogin:(id)sender
{
    PPLoginViewController *login = [[PPLoginViewController alloc] initWithNibName:@"PPLoginViewController" bundle:nil];

    PPAppDelegate *appDelegate = [UIApplication sharedApplication].delegate;
    appDelegate.window.rootViewController = login;

    [self.view insertSubview:login.view atIndex:0]; 
}

什么是“不需要的视图元素”? - Wain
导航栏是不需要的。 - Marqueone
2个回答

14

使用UINavigationController作为rootViewController是创建iOS应用程序的好方法。

据我理解,不需要的视图元素是指navigationBar?您可以手动隐藏它,设置:


```swift navigationController?.setNavigationBarHidden(true, animated: false) ```
[self.navigationController setNavigationBarHidden:YES];

关于您的情况,如果您想更改当前视图控制器(面向iOS 6),您可以直接呈现新的视图控制器:

[self presentViewController:login animated:YES completion:nil];

或者添加子视图 (这里有一个不错的例子来添加和删除子视图):

[self addChildViewController:login];

为什么要将UINavigationController设置为根视图控制器?

1)首先,它使你的应用程序可见的视图控制器结构良好(尤其是在iPhone上)。您可以随时获取堆栈并弹出(或移动)到任何想要的视图控制器。

2)我为什么总是将导航设置为根视图控制器呢?因为它使应用程序更易于支持,所以添加一些功能到应用程序不需要太多的代码更改。

如果您创建一个具有许多子级或呈现其他视图控制器的(根)视图控制器,则会使您的代码非常难以维护,并且会产生类似于"god-object"的东西。


我想你的意思是setNavigationBarHidden:YES。 - Ryan F
为什么这是一件好事呢?导航控制器并不是很有意义(我可能是错的),应该用它来导航子视图而不是整个视图控制器。 - Marqueone
@codejam 导航控制器的唯一目的是在整个视图控制器之间进行导航。 - Patrick Goley

1

听听George的话,UINavigationController是最好的选择。你不想使用它的原因是无效的。

然而,导致你的代码不起作用的原因可能与在设置根视图控制器为登录vc之后不必要的代码有关。

根据Apple的文档,设置根视图控制器会自动将窗口的视图设置为视图控制器的视图。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接