我有一堆UIViewController
的子类(我们称它们为MainForm
、DetailForm
、MoreMinorDetails
)。基本上,这个想法是AppDelegate
类实例化MainForm
,用户在MainForm
上按下某种类型的按钮,DetailForm
就会出现。然后按下DetailForm
上的按钮启动MoreMinorDetails
。当然,我应该能够回到MainForm
。
请注意,在任何地方都看不到任何UINavigationController
对象
以上述方式在UIViewController
之间移动的可接受模式是什么?
还是我的做法不对?我很乐意接受基于XCode或MonoTouch的解释。
您可以使用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
的功能,并保留视图中的所有空间。
AngryHacker,
我的简单建议是遵循zoul一个。我认为实现您想要的最简单的方法是创建一个UINavigationController
,并将其用作其他控制器的包含控制器。
因此,方法可以是在AppDelegate
中创建一个UINavigationController
,并将其设置为window
的rootViewController
。当您创建一个UINavigationController
时,您可以向它传递一个根控制器(在本例中为MainForm
)。
在MT中,它看起来如下(不要相信代码,因为我是手工编写的)
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);
要转到DetailForm
或MoreMinorDetails
内的根控制器(MainForm
),请使用
this.NavigationController.PopToRootViewControllerAnimated(false);
关于空间,这不是问题。我想你有两种方法。第一种是移动您在导航控制器栏中创建的栏项。在每个控制器中,您可以决定哪些按钮可见或不可见。第二种方法是完全隐藏导航栏并使用您已经创建的按钮。
在这两种方式中,您都可以将操作附加到这些按钮,并允许在控制器之间进行导航。此外,如果您选择第一个,还可以隐藏导航栏的后退按钮。
需要注意的一个简单事项如下:
由于导航栏对于UINavigationController
是唯一的,因此导航栏将为您在导航控制器中按下的所有控制器保持其状态。为了解释这个概念,假设你有两个控制器,比如A和B。你首先按下A,在它的ViewWillAppear
方法中,你隐藏了一个按钮。当您按下B时,按钮仍然不可见。如果你想取消隐藏B中的按钮,你可以用它的ViewWillAppear
方法(像以前一样)等等…
如果您不想玩UINavigationController
,您应该看看UIViewController
类提供的新视图控制器包含功能。这仅适用于iOS>=5。你可以获得与UINavigationController
机制相同的效果,但可能更难实现。
希望能有所帮助。