设置 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
继承自 UIViewController
,UIViewController
具有为您在导航布局中看到的所有内容(例如导航项和标题)定义的属性。更重要的是,它还具有父视图控制器、呈现它的视图控制器和导航控制器的属性。因此,考虑到层次结构,您的应用委托应该只实例化导航控制器的根 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 作为子视图问题
情节提要:更改情节提要中指定的 UINavigation 控制器的根视图
来自第二个视图控制器的 UItabBar 但所有视图控制器都有 UInavigation 并返回到 firstViewController 问题