使用模态视图作为“普通”视图

时间:2010-09-23 15:51:09

标签: iphone objective-c cocoa-touch uiviewcontroller

我想使用模态视图(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];

2 个答案:

答案 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层次结构,它将表现得像一个“普通”层。

您无法多次将同一个视图控制器推送到导航堆栈。只有一次。

另请参阅此内容以了解如何自定义视图:

SO modal question