0

我正在尝试在同一个情节提要上加载 UIViewController,我为视图控制器提供了情节提要 ID、恢复 ID(与情节提要 ID 相同)和视图控制器标题为“故障”。

我有一个注册为 getStarted 的操作,我在其中运行以下代码,我还导入了我想使用 Get Started 按钮在视图控制器中加载的视图控制器

#import "BreakdownViewController.h"

'

- (IBAction)getStarted:(id)sender {
    NSLog(@"Yes");
    BreakdownViewController *controller = [[BreakdownViewController alloc] initWithNibName:@"breakdown" bundle:nil];
    [self.navigationController pushViewController:controller animated:YES];
}

是的注销,但视图控制器不加载。

任何想法为什么?

4

3 回答 3

2

视图未加载,因为您试图从 nib 文件而不是情节提要加载它。我假设这是可以正确加载BreakdownViewController的子类或控制器。UIViewController将您的代码更改为此。

  // You could change `BreakdownViewController` to `UIViewController` if it doesn't work with it.
  // iOS 6.0 and above.
  BreakdownViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"breakdown"];
  [self presentViewController:controller animated:YES completion:nil];

由于不推荐使用方法,您应该真正使用上面的代码,但您也可以这样做。

   // iOS 5.0
   BreakdownViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"breakdown"];
   [self presentModalViewController:controller animated:YES];

您还可以为此添加一些过渡动画,也可以在下面添加以下presentModalViewControllerpresentViewController

   [controller setModalTransitionStyle:UIModalTransitionStyleFlipHorizontal];

您也可以替换 'presentModalViewController' 或presentViewController

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

编辑

用户使用上面提供的代码后,出现错误

2013-02-24 16:08:14.517 BudgetMe[1300:c07] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSCFString stringByAppendingString:]: nil argument' *** First throw call stack: (0x1cac012 0x10e9e7e 0x1cabdeb 0xaf87d5 0xddba 0x10f1c7 0x10f232 0x11ac25 0x31a3a3 0x117ee3 0x118167 0x312c 0x10fd705 0x312c0 0x31258 0xf2021 0xf257f 0xf16e8 0x60cef 0x60f02 0x3ed4a 0x30698 0x1c07df9 0x1c07ad0 0x1c21bf5 0x1c21962 0x1c52bb6 0x1c51f44 0x1c51e1b 0x1c067e3 0x1c06668 0x2dffc 0x252d 0x2455) 

当它到达[self.navigationController pushViewController...]/[self presentViewController...]我相信这是由于用户试图推送/呈现的视图控制器上的问题而引发的错误。我相信这是因为当这行代码被命中时,它会尝试像viewDidLoad在移动到实际视图控制器之前那样运行方法,所以如果抛出错误,它会显示为好像它在这一行上。找出这一点的最佳方法是充分利用断点。

我在NSRangeException 之前遇到过这个问题,原因是:'*** -[__NSArrayM objectAtIndex:]: index 0 beyond bounds for empty array' 当呈现视图控制器时

于 2013-02-24T15:33:43.800 回答
0

你可能想用这个:

[self.storyboard instantiateViewControllerWithIdentifier:@"breakdown"];

而不是 alloc initWithNibName。

于 2013-02-24T15:35:30.860 回答
-1

如果我正确理解了这个问题,您是否在与您尝试推送的故事板相同的情节提要中定义了一个视图控制器?你为什么不使用segue?创建从源到目标的推送序列,并让按钮触发该序列。

一旦 segue 连接好,您可以通过以下方式以编程方式调用推送:

[self performSegueWithIdentifier:@"breakdownSegue"];

但是,如果您将 segue 直接连接到要调用 segue 的按钮,则可以跳过该步骤。

如果问题是 BreakdownViewController 是在外部 .xib 中定义的,并且您将其添加到此情节提要中,只需从情节提要场景中删除视图,它将从 .xib 加载视图。

于 2013-02-24T18:08:05.203 回答