设置 UINavigation 控制器和各种视图加载

Posted

技术标签:

【中文标题】设置 UINavigation 控制器和各种视图加载【英文标题】:Setting up a UINavigation controller and various view loads 【发布时间】:2012-10-29 17:03:23 【问题描述】:

我已经设置了一个 UINavigation 控制器,它使用 AppDelegate 作为主要联系点。

我有不同的方法可以运行,例如 presentHomeViewController、presentLoginViewController,它们将不同的视图控制器推送到导航控制器。

应用委托 - didFinishLaunching

welcomeViewController = [[MyWelcomeViewController  alloc] initWithNibName:@"MyWelcomeViewController" bundle:nil];
navController = [[UINavigationController alloc] initWithRootViewController:welcomeViewController];
navController.navigationBarHidden = YES;

self.revealSideViewController = [[PPRevealSideViewController alloc] initWithRootViewController:navController];

[self.revealSideViewController setDirectionsToShowBounce:PPRevealSideDirectionNone];
[self.revealSideViewController setPanInteractionsWhenClosed:PPRevealSideInteractionContentView | PPRevealSideInteractionNavigationBar];

self.window.rootViewController = self.revealSideViewController;

这是正确的过程吗?

- (void)presentHomeViewController 
// We start by dismissing the ModalViewConrtoller which is LoginViewController from the welcomeview
[self.welcomeViewController dismissModalViewControllerAnimated:YES];

// Check if the home view controller already exists if not create one
if (!self.homeViewController) 
    NSLog(@"presentHomeViewController- Creating the Home View controller");
    homeViewController = [[MyHomeViewController alloc] initWithNibName:@"MyHomeViewController" bundle:nil];


// Push the homeViewController onto the navController
NSLog(@"presentHomeViewController");
self.navController.navigationBarHidden = NO;
[self.navController setTitle:@"Home"];
[self.navController pushViewController:homeViewController animated:NO];

如果我随后将以下内容添加到不同的类:

[self.navigationController pushViewController:accountViewController animated:NO];

没有视图被推送到堆栈,我应该像我一直在做的那样控制 AppDelegate 中的所有移动,还是有更好的方法来解决这个问题?

【问题讨论】:

【参考方案1】:

编辑

感谢您发布代码。因此,为了首先解决您的最后一个问题,我不建议从应用程序委托控制您的导航堆栈。您应该从作为导航控制器子级的视图控制器控制堆栈。

此时,请记住视图控制器的层次结构:UINavigationController 继承自 UIViewControllerUIViewController 具有为您在导航布局中看到的所有内容(例如导航项和标题)定义的属性。更重要的是,它还具有父视图控制器、呈现它的视图控制器和导航控制器的属性。因此,考虑到层次结构,您的应用委托应该只实例化导航控制器的根 VC 和导航控制器本身,然后设置导航控制器的根 VC。

从那里,您应该从 VC 本身推送和弹出其他 VC。请记住,每个 VC 都有一个属性,该属性会自动设置为指向它所属的导航控制器。这就是[self.navigationController pushViewController:] 起作用的原因。例如,如果我有一个导航控制器,其根 VC 为 UITableViewController,并且点击表视图中的一项将新的 VC 推送到堆栈中,我将从表 VC 中推送该 VC,而不是从导航控制器类或应用委托。

对不起,如果这令人困惑。请让我知道是否需要澄清,我会尽力而为。否则,希望这能让您走上正轨。

【讨论】:

抱歉,我使用了显示侧控制器,不想通过显示来混淆情况,尽量保持简单。我已经用信息更新了这个问题。谢谢 谢谢,所以当我尝试运行 self.navigationController presentViewController 时出现错误“没有可见的@interface 或 UINavigationController 声明选择器 presentViewController... 这是否意味着我必须在每个视图控制器? 您是从应用委托发送 presentViewController:animated:completion: 吗?如果是这样,则应用程序委托不会从UIViewController 继承,因此不会实现该方法。除非你有类似UITabBarController 的东西,否则你不需要为每个视图控制器初始化一个新的UINavigationController。您只需要初始化一个导航控制器,为其设置一个根 VC,然后从根 VC 和任何其他可能从该链中某处推送的 VC 调用 presentViewController:...。 navigationController 属性将指向主导航控制器。 我实际上是在尝试从 UITableViewController 的子类中呈现 ViewController。在这种情况下,我应该先启动一个新的导航控制器然后 presentViewController 还是在从非 UIViewController 类呈现时使用 AppDelgate? 看看我制作的这个粗略的图表:i46.tinypic.com/14qyhv.png。就视图而言,您的 AppDelegate 应该做的就是初始化 tableview 子类的实例和导航控制器,将 tableview 实例设置为导航控制器的根 VC,并将导航控制器设置为窗口的根 VC。从那里,所有导航都应由各个 VC 处理,因为来自导航控制器的根 VC 的任何内容都将指向该导航控制器。对于要呈现的每个视图控制器,您不需要导航控制器。

以上是关于设置 UINavigation 控制器和各种视图加载的主要内容,如果未能解决你的问题,请参考以下文章

如何仅为一个视图控制器设置 UINavigation 栏的 titletextattributes?

UINavigation 控制器 UIViewController 和 UItoolbar 作为子视图问题

iPhone UINavigation 控制器问题?

UINavigation 将同一视图控制器推送两次错误

情节提要:更改情节提要中指定的 UINavigation 控制器的根视图

来自第二个视图控制器的 UItabBar 但所有视图控制器都有 UInavigation 并返回到 firstViewController 问题