Iphone 使用模态视图作为";“正常”;看法
我想使用模式视图(Iphone 使用模态视图作为";“正常”;看法,iphone,objective-c,cocoa-touch,uiviewcontroller,Iphone,Objective C,Cocoa Touch,Uiviewcontroller,我想使用模式视图(UIViewController)作为“普通”视图,可以将其推送到导航控制器堆栈上。通常,模态视图的显示方式如下: LoginViewController *myView = [[MyViewController alloc] init]; UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:myView]; [self.naviga
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];
但我想这样做:
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];
问题是我的模态视图有一个右键和一个左键。因此,我必须检查视图是如何加载的,并以另一种方式显示按钮。这背后的想法是有后退按钮。因此,我可以多次使用相同的模态视图
编辑:
@彼得:
现在我以你为例。我的问题是,我在模态视图中使用了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];
这方面的好建议 我更喜欢使用的属性:
@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创建视图控制器,但正如往常一样,请参阅,尤其是标题为“定义自定义视图控制器类”的部分。澄清一下:myView不是模态的。你只是把它作为一个模态来表示 如果您只是将其推入UINavigationController层次结构,它的行为将类似于“正常”层次结构 不能多次将同一视图控制器推送到导航堆栈上。就一次 有关如何自定义视图,请参见以下内容:
好的,我将其显示为模态视图。您有“真实”模态视图的示例吗?我不想同时把它推到堆栈上。你说一次是什么意思?我可以将其作为堆栈上的普通视图,但以后不能作为模式视图?感谢您提供的示例代码。我认为它会工作得很好,但我正在使用
UINavigationController
来显示我的模态视图。我编辑的问题解释了我为什么要这么做。也许你可以提供一个解决方案。你的支持太好了!这个解决方案非常简单,效果很好。现在有一些问题需要我理解:1)为什么要在实现文件中进行新的接口声明?2) initForModal
中的if
调用超级构造函数,如果成功,则返回对象(ViewController
),否则返回nil。这是正确的吗?在if
语句中,如果对象不是nil,则仅设置一个选项。3) 我需要这里的属性,因为变量是在方法边界上方使用的?很高兴它很有用-1)它是隐藏模态属性,因为它不用于此类实现之外;2) 是的,绝对如此,这是init方法的一种通用obj-c风格;3) 我使用一个属性只是为了让事情更简单,我想你的问题的答案是肯定的?记住,如果答案有帮助,也要投票支持,谢谢。