【问题标题】:How to display a view?如何显示视图?
【发布时间】:2014-08-04 00:53:41
【问题描述】:

我是 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 的视图可见,我需要进行哪些更改?

【问题讨论】:

  • 你真的有导航控制器吗?换句话说:self.navigationController 不是 nil

标签: ios objective-c cocoa-touch


【解决方案1】:
  • 如果你想呈现,那么不需要 UINavigationalController。
  • 但是对于推送 UINavigationalController 是必须的。
  • 在 Storyboard 中,您必须添加一个 UINavigationalController。

  • 在 Button Actions 中使用 nib Name 正确初始化 VC。
 RegisterViewController* controller = [[RegisterViewController alloc] initWithNibName:@"RegisterViewController" bundle:nil];
    [self.navigationController pushViewController:controller animated:YES];

【讨论】:

    【解决方案2】:

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

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

    而不是

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

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

    UINavigationController 当你想维护一个视图控制器堆栈时也很方便,你可以根据需要推送或弹出。这也会自动为您提供“返回”按钮。如果您只需要展示一个视图控制器,那么presentViewController: 可能是正确的选择。

    【讨论】:

    • 如果您觉得慷慨,您可以编辑您的答案并告诉 OP 为什么发送到nil 的消息没有任何作用。
    • @GenieWanted 非常感谢您的回答。请原谅我一个愚蠢的问题,但是为什么对 nil 对象的调用不会导致 NullReferenceExeption 或类似的东西(就像在 Java 和 C# 中那样)?
    • 这实际上是一个有趣的问题。这在stackoverflow.com/questions/2696891/…这里得到了很好的解释...这完全是关于Objective C是如何看待它的。
    【解决方案3】:

    如果您正在使用情节提要,那么您需要从情节提要中获取视图控制器,例如

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

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

    然后像你已经在做的那样将它传递给你的导航控制器,只要你的导航控制器不是nil

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

    刚刚被告知您没有使用情节提要,由于我所在的位置,我无法下载您的链接,因此我提供了带有情节提要的解决方案。我的建议是转向使用故事板。

    将其保留在这里,因为它可以帮助遇到相同问题但正在使用情节提要的其他人

    【讨论】:

      【解决方案4】:
      RegisterViewController *news=[[RegisterViewController alloc] initWithNibName:@"RegisterViewController" bundle:nil];
      [self.navigationController pushViewController:news animated:YES];
      [news release];
      

      【讨论】:

        【解决方案5】:

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

        喜欢这个

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

        【讨论】:

          猜你喜欢
          • 2011-04-01
          • 2016-03-31
          • 1970-01-01
          • 1970-01-01
          • 2022-01-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多