如何显示视图?

时间:2014-06-13 12:49:06

标签: ios objective-c cocoa-touch

我是iOS开发的新手。

我有一个带按钮的ViewController ViewController。当用户按下该按钮时,我想将视图切换到RegisterViewController

ViewController.m包含以下代码:

#import "ViewController.h"
#import "RegisterViewController.h"

@interface ViewController ()

@end

@implementation ViewController

@synthesize registerViewButton;

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


- (IBAction)registerViewButtonClick:(id)sender {
    NSLog(@"registerViewButtonClick called");

    RegisterViewController* controller = [[RegisterViewController alloc] init];
    [self.navigationController pushViewController:controller animated:YES];    
}

@end

根据调试输出,当我按下按钮时,实际上调用了registerViewButtonClick方法。

但RegisterViewController表示的视图不会出现。

该应用程序的代码可用here

当按下按钮时,我需要更改什么才能使RegisterViewController的视图变得可见?

5 个答案:

答案 0 :(得分:2)

我运行了你的代码,发现你的代码中没有实现导航控制器,但是你试图推送registerViewController。尝试呈现如下的viewcontroller:

[self presentViewController:controller animated:YES completion:nil];

而不是

[self.navigationController pushViewController:controller animated:YES]; 

pushViewController只有在有UINavigationController时才有效。根据文档,UINavigationController类实现了一个专门的视图控制器,用于管理分层内容的导航。因为,代码中没有UINavigationController(在这种情况下self.navigationControllernil),当您尝试推送viewController时没有任何反应。

当您想要维护一堆viewControllers时,UINavigationController也很方便,您可以根据需要推送或弹出。这也让你回归'按钮自动。如果您只需要提供一个viewcontroller,那么presentViewController:可能是正确的选择。

答案 1 :(得分:1)

  • 如果你想呈现则不需要UINavigationalController。
  • 但是为了推动UINavigationalController是必须的。
  • 在Storyboard中,您必须添加一个UINavigationalController。

enter image description here

  • 在按钮操作中,使用nib名称正确初始化VC。
 RegisterViewController* controller = [[RegisterViewController alloc] initWithNibName:@"RegisterViewController" bundle:nil];
    [self.navigationController pushViewController:controller animated:YES];

答案 2 :(得分:0)

您可能需要使用nib名称初始化UIViewController ..

像这样

RegisterViewController* controller = [[RegisterViewController alloc] initWithNibName:@"RegisterViewController" bundle:nil];

答案 3 :(得分:0)

RegisterViewController *news=[[RegisterViewController alloc] initWithNibName:@"RegisterViewController" bundle:nil];
[self.navigationController pushViewController:news animated:YES];
[news release];

答案 4 :(得分:0)

如果您使用的是故事板,那么您需要从故事板中获取视图控制器,如

RegisterViewController *viewController = (RegisterViewController*)[[UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil] instantiateViewControllerWithIdentifier:@"vc-identifier"];

vc-identifier替换为您在故事板中作为标识符提供的内容,并将MainStoryboard替换为storybaord的名称。

然后将其传递到导航控制器,就像您已经在做的那样,只要您的导航控制器不是nil

[self.navigationController pushViewController:controller animated:YES];   

刚刚被告知您没有使用故事板,因为我的位置,我无法下载您的链接所以我提供了故事板的解决方案。我的建议是转向使用故事板。

将此留在此处,因为它可能会帮助其他遇到相同问题但正在使用故事板的人