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) 我使用一个属性只是为了让事情更简单,我想你的问题的答案是肯定的?记住,如果答案有帮助,也要投票支持,谢谢。