5

私の質問がばかげているように聞こえるかもしれませんが、すみません。私は iOS 開発に比較的慣れていませんが、iOS6 用にアプリを移植する必要があります。このアプリは iOS 5 と XCode 4.3.2 で完全に動作しますが、iPhone 6.0 シミュレーターの Xcode 4.5 に奇妙なバグがあります。初期画面が読み込まれた後、任意のボタンを押すことができますが、次のエラーが表示されます。

 `Terminating app due to uncaught exception 'NSGenericException', reason: 'Could not find a navigation controller for segue 'register'. Push segues can only be used when the source controller is managed by an instance of UINavigationController.`

StartScreenViewController の prepareForSegue メソッドは次のようになります。

if ([[segue identifier] isEqualToString:@"register"] || [[segue identifier] isEqualToString:@"forgotPassword"]) {
    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:[segue destinationViewController]];
    appDelegate.window.rootViewController = navController;
}

ブレークポイントを設定すると、メソッドがまだ正しく呼び出されていることがわかりますが、prepareForSegue が終了した後、前述のエラーでアプリがクラッシュします。誰かが私を正しい方向に向けることができますか?

マーティン、どうもありがとう

4

3 に答える 3

5

「アプリは完璧に動作していた」と言うことができますが、実際には、引用されたコードは常に非常に間違っていたため、この間違いが明らかになりつつあるようです。アプリの途中でウィンドウのルート ビュー コントローラーを変更しないでください。起動時に一度設定し、二度と設定しないでください。Joshua が正しく言ったように、セグエの準備は、セグエ自体が混乱しようとしているビュー コントローラーの構造をいじる時ではありません。

あなたの手にバスケットケースがあります。別のステップに進む前に、iOS とビュー コントローラー (およびストーリーボード) をいったん停止して理解することをお勧めします。ここにいくつかの助けがあります:

http://www.apeth.com/iOSBook/ch19.html

于 2012-09-29T16:23:05.267 に答える
5

Cocoaを使用しているため、 StartScreenViewControllerの階層でpush segue 祖先のナビゲーション コントローラーを探しています

  • 見つかった場合は、それを使用して、新しいビュー コントローラーをそのナビゲーション コントローラーのスタックに自動的にプッシュします。
  • 見つからないため、アプリがクラッシュしています。

prepareForSegue: iOS によって自動的に表示されようとしている VCを構成するために存在します。VC を表示するのはあなたの責任ではありません。これは、window.rootViewController を設定したときに行っているように見えます。

これらのドキュメントを読むことをお勧めします: http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/Introduction/Introduction.html

于 2012-09-29T16:13:00.727 に答える
2

私も同じ問題を抱えてる。アプリストアからダウンロードした場合、アプリはios6デバイスでうまく機能しますが、同じコードはデバイスでもシミュレータでも機能しません。非常に奇妙な問題。

私のアプリの構造は次のとおりです。

NavigationController -> UIViewController (PageControl を持ち、複数のページを保持し、水平方向にスクロール可能) -> UITableViewController (1 つのカテゴリのニュースの 1 つのリストを表す)、およびユーザーが 1 つのニュースをクリックすると、DetailsViewController (UIViewController のインスタンス) を取得します。

これは、prepareForSegue のコードです。

    if ([[segue identifier] isEqualToString:@"ShowTelegrafDetails"]){
    TelegrafDetailsViewController *details = (TelegrafDetailsViewController*)segue.destinationViewController;

    NSIndexPath *myIndexPath = [self.tableView indexPathForSelectedRow];     

    if([self isItPad])
        details.linkFromTableView = [[otherNews objectAtIndex:myIndexPath.row] link];
    else
        details.linkFromTableView = [[[myViewController.itemMatrix objectAtIndex:[self calculateCurrentPage]] objectAtIndex:myIndexPath.row] link];

    NSLog(@"%@",segue.sourceViewController);
    NSLog(@"%@",segue.destinationViewController);

    [self.myViewController.navigationController pushViewController:details animated:YES];
    }

ソース ビュー コントローラーが想定どおりに設定されているようです。ストーリーボードを使用すると、NavigationController が自動的に設定されます。RootViewController をどこかに明示的に設定する必要があるかどうかはわかりませんが、AppDelegate で設定するのは難しいかもしれません。これは、デリゲートとルートになるべきクラス (UITableViewController) の間にさらに 2 つのビュー階層があるためです。

誰かがそれについてもっと知っているなら、私は永遠に感謝しています. そうでなければ、私はいくつかの指示を使うことができます. このトピックに関するアップルのドキュメントを読みましたが、この複雑な状況になると完全には理解できません。

また、解決策が見つかった場合は、上司のように喜んでここに投稿します。:D

事前にサンクス。

編集:

私はこの問題を解決することができました。セグエを削除し、 prepareForSegueのコードをdidSelectRowAtIndexPathに適切な修正を加えて配置しました。これは理想的な解決策ではありませんが、問題を解決します。ただし、4.3 以降のデバイスをサポートする予定であり、その場合、ストーリーボードはオプションではありません。

また、コードを再確認したところ、RootViewController が正しく作成および表示され、NavigationController が正常に機能し、セグエが機能しない理由をまだ理解できません。

乾杯。

于 2012-10-01T10:14:31.663 に答える