0

同じストーリーボードに UIViewController を読み込もうとしています。View Controller に Storyboard ID、Restoration ID (Storyboard ID と同じ)、および View Controller Title 'breakdown' を指定しました。

次のコードを実行している 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];
}

はい、ログアウトしますが、View Controller は読み込まれません。

理由はありますか?

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];

presentModalViewControllerこれにトランジションアニメーションを追加することもできます。また、またはの直前に下の行を追加して購入することもできます。presentViewController

   [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...]されていました。ユーザーがプッシュ/提示しようとしたView Controllerの問題が原因で、エラーがスローされるようになったと思います。これを信じる理由は、このコード行がヒットするとviewDidLoad、実際のView Controllerに移動する前のようにメソッドを実行しようとするため、エラーがスローされると、代わりにこの行にあるかのように表示されるためです。これを見つける最良の方法は、ブレークポイントを最大限に活用することです。

私はNSRangeExceptionの前にこの問題に苦しんでいます'、理由:' ***-[__ NSArrayM objectAtIndex:]:ビューコントローラを提示するときに空の配列の境界を超えたインデックス0'

于 2013-02-24T15:33:43.800 に答える
0

おそらくこれを使用したいでしょう:

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

alloc initWithNibName の代わりに。

于 2013-02-24T15:35:30.860 に答える
-1

質問を正しく理解できれば、プッシュしようとしているストーリーボードと同じストーリーボードにビュー コントローラーが定義されていますか? なぜセグエを使わないのですか?ソースから宛先へのプッシュ セグエを作成し、ボタンでそのセグエをトリガーします。

セグエが接続されたら、次のようにプログラムでプッシュを呼び出すことができます。

[self performSegueWithIdentifier:@"breakdownSegue"];

ただし、セグエを呼び出したいボタンにセグエを直接配線する場合は、そのステップをスキップできます。

BreakdownViewController が外部の .xib で定義されていて、それをこのストーリーボードに追加したことが問題である場合は、ストーリーボード シーンからビューを削除するだけで、.xib からビューが読み込まれます。

于 2013-02-24T18:08:05.203 に答える