我有一堆UIViewController
个子类(让我们称之为MainForm
,DetailForm
,MoreMinorDetails
)。基本上这个想法是AppDelegate
类实例化MainForm
,用户按下MainForm
上的某种类型的按钮,DetailForm
出现。然后在DetailForm
启动MoreMinorDetails
上的按钮上。当然,我应该可以回到MainForm
。
请注意,任何地方都没有任何UINavigationController
个对象
以上述方式在UIViewController
之间移动的接受模式是什么?
或者我是以错误的方式解决这个问题? 我会对基于XCode或MonoTouch的解释感到满意。
答案 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
。
退一步,例如从MoreMinorDetails
到MoreMinorDetails
使用
DetailForm
转到this.NavigationController.PopViewControllerAnimated(false);
或MainForm
使用
DetailForm
)
MoreMinorDetails
关于空间,这不是问题。我猜你有两种方法。第一种是移动您在导航控制器栏中创建的条形项。在每个控制器中,您可以决定哪些按钮可见或不可见。第二个是完全隐藏导航栏并使用您已经创建的按钮。
在这两种方式中,您都可以将操作附加到这些按钮,并允许在控制器之间进行导航。此外,如果您选择第一个,您还可以隐藏导航栏的后退按钮。
要记住的一个简单注意事项如下:
由于导航栏对于this.NavigationController.PopToRootViewControllerAnimated(false);
是唯一的,因此该栏将保持您在导航控制器中推送的所有控制器的状态。要解释这个概念,假设你有两个控制器,比如说A和B.首先按A并在其UINavigationController
方法中隐藏一个按钮。按B键时,按钮仍然不可见。如果要取消隐藏B中的按钮,可以使用其ViewWillAppear
方法(如前所述)等等...
如果您不想使用ViewWillAppear
,您应该查看UINavigationController
类提供的新视图控制器包含功能。这仅适用于iOS> = 5.您可以获得UIViewController
机制的相同效果,但可能更难实现。
希望有所帮助。