我想使用模态视图(UIViewController
)作为“普通”视图,可以在导航控制器堆栈上推送。通常,模态视图如下所示:
LoginViewController *myView = [[MyViewController alloc] init];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:myView];
[self.navigationController presentModalViewController:navController animated:YES];
[myView release];
myView = nil;
[navController release];
navController = nil;
但我想做这样的事情:
[[self navigationController] pushViewController:myView animated:YES];
问题是我的模态视图有一个右键和左键。所以我必须检查视图的加载方式并以另一种方式显示按钮。这背后的想法是有后退按钮。所以我可以使用相同的模态视图几次。
修改
@petert:
现在我按照你的例子。我的问题是我使用UINavigationBar
作为模态视图。为了得到这个UINavigationBar
,我创建了一个导航控制器。我正在使用导航栏,因为我有我的按钮。因此,检查parentViewController
类型UINavigationController
是否适合我。我总是得到一个模态视图。我是这样做的:
// load modal view
MyViewController *myView = [[MyViewController alloc] init];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:myView];
[[self navigationController] presentModalViewController:navController animated:YES];
[navController release];
navController = nil;
[myView release];
myView = nil;
// load as normal view
MyViewController *myView = [[MyViewController alloc] init];
[[self navigationController] pushViewController:myView animated:YES];
答案 0 :(得分:2)
此StackOverflow中的好提示answer。
我更喜欢使用UIViewController的属性:
@property(nonatomic, readonly) UIViewController *parentViewController
在视图控制器的子类中:
查看控制器的
parentViewController
属性的值。如果它是UINavigationController
的实例,那么您就在导航堆栈中。如果您以模态方式显示,它将是您上一个视图控制器的实例。
所以在-viewDidLoad
例如:
- (void)viewDidLoad
{
if ([self.parentViewController isKindOfClass:[UINavigationController class]])
{
// navigation controller
self.title = @"...";
}
else
{
// modal
self.title = @"Modal";
// add cancel and done buttons now...
}
}
或,一个非常简单的解决方案是将init
方法自定义为MyViewController
类,以便对视图控制器的意图进行编码。
将以下内容添加到MyViewController
标题中:
@interface MyViewController : UIViewController
{
BOOL modal;
}
- (id)initForModal:(BOOL)isModal;
@end
现在在实施文件中:
@interface MyViewController ()
@property (nonatomic) BOOL modal;
@end
@implementation MyViewController
@synthesize modal;
- (id)initForModal:(BOOL)isModal;
{
if (self = [super initWithNibName:@"MyViewController" bundle:nil])
{
self.modal = isModal;
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
if (self.modal)
{
// add cancel and done buttons …
}
else
{
// assuming we're presented from a navigation view …
}
}
现在以模态方式使用:
// load modal view
MyViewController *myView = [[MyViewController alloc] initForModal:YES];
或者不是模态的:
// load as normal view
MyViewController *myView = [[MyViewController alloc] initForModal:NO];
我假设您正在从NIB创建视图控制器,但总是看到View Controller Progamming Guide for iOS,尤其是标题为“定义自定义视图控制器类”的部分。
答案 1 :(得分:0)
澄清一下:myView不是模态的。你只是将它作为一个模态呈现。
如果你只是将它推入UINavigationController层次结构,它将表现得像一个“普通”层。
您无法多次将同一个视图控制器推送到导航堆栈。只有一次。
另请参阅此内容以了解如何自定义视图: