在iOS中的UIViewControllers之间导航的模式是什么?

时间:2012-09-05 07:18:59

标签: xcode uiviewcontroller xamarin.ios navigation

我有一堆UIViewController个子类(让我们称之为MainFormDetailFormMoreMinorDetails)。基本上这个想法是AppDelegate类实例化MainForm,用户按下MainForm上的某种类型的按钮,DetailForm出现。然后在DetailForm启动MoreMinorDetails上的按钮上。当然,我应该可以回到MainForm

请注意,任何地方都没有任何UINavigationController个对象 以上述方式在UIViewController之间移动的接受模式是什么?

或者我是以错误的方式解决这个问题? 我会对基于XCode或MonoTouch的解释感到满意。

2 个答案:

答案 0 :(得分:2)

您可以使用UINavigationController并隐藏导航栏:

self.navigationController.navigationBar.hidden = YES;

然后在按钮的操作中按下下一个视图控制器:

-(void)buttonAction:(id)sender
{
    NextViewController *nextViewController = [[NextViewController alloc] init];
    [self.navigationController pushViewController:nextViewController animated:YES];
}

要返回,请使用

-(void)goBack
{
    [self.navigationController popViewControllerAnimated:YES];
}

要转到某个视图控制器(您必须确切知道它何时被推到导航控制器的堆栈上):

-(void)goToViewController
{
    [self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1] animated:YES];
}

或弹出到根视图控制器

[self.navigationController popToRootViewControllerAnimated:YES];

这样,您将获得UINavigationController的功能并保留视图中的所有空间。

答案 1 :(得分:1)

AngryHacker,

我的简单建议是遵循 zoul 之一。我认为最简单的方法是实现你想要的'创建UINavigationController并将其用作其他控制器的包容控制器​​。

因此,可以在UINavigationController中创建AppDelegate,并将其设置为rootViewController的{​​{1}}。创建window时,您可以向其传递根控制器(在本例中为UINavigationController)。

在MT中,它看起来如下(不要相信代码,因为我手写了它)

MainForm

现在,当您启动应用程序时,您将看到private UINavigationController navController; public override bool FinishedLaunching (UIApplication app, NSDictionary options) { navController = new UINavigationController(new MainForm()); window.RootViewController = navController; window.MakeKeyAndVisible (); return true; } 的视图,并且可以允许在不同的控制器之间导航。

例如,在MainForm中,您可以转到MainForm,如:

DetailForm

同样适用于this.NavigationController.PushViewController(new DetailForm(), true); DetailForm

退一步,例如从MoreMinorDetailsMoreMinorDetails使用

DetailForm

转到this.NavigationController.PopViewControllerAnimated(false); MainForm使用

中的根控制器(DetailForm
MoreMinorDetails

关于空间,这不是问题。我猜你有两种方法。第一种是移动您在导航控制器栏中创建的条形项。在每个控制器中,您可以决定哪些按钮可见或不可见。第二个是完全隐藏导航栏并使用您已经创建的按钮。

在这两种方式中,您都可以将操作附加到这些按钮,并允许在控制器之间进行导航。此外,如果您选择第一个,您还可以隐藏导航栏的后退按钮。

要记住的一个简单注意事项如下:

由于导航栏对于this.NavigationController.PopToRootViewControllerAnimated(false); 是唯一的,因此该栏将保持您在导航控制器中推送的所有控制器的状态。要解释这个概念,假设你有两个控制器,比如说A和B.首先按A并在其UINavigationController方法中隐藏一个按钮。按B键时,按钮仍然不可见。如果要取消隐藏B中的按钮,可以使用其ViewWillAppear方法(如前所述)等等...

如果您不想使用ViewWillAppear,您应该查看UINavigationController类提供的新视图控制器包含功能。这仅适用于iOS> = 5.您可以获得UIViewController机制的相同效果,但可能更难实现。

希望有所帮助。