1

ナビゲーション テーブル ビューを備えたタブ バーがあります。テーブル ビューでセルを選択すると、アプリがクラッシュします。セルが選択されたときに新しいビューコントローラーが開くようにします。didselectrowatindexpath が呼び出されたときに正しくプッシュしていないと思います。アプリは数秒間ハングアップしたままになり、その後閉じます。

このコードで目を引くものはありますか? またはサンプルコードはありますか?シミュレーター 4.3 で Xcode 3 を使用しています。

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
        NSInteger row = [indexPath row];
        if (self.vailViewController == nil) {
            VailViewController *vailView = [[VailViewController alloc]  initWithNibName:@"View" bundle:nil];
            self.vailViewController = vailView;
            [vailView release];
        }

        vailViewController.title = [NSString stringWithFormat:@"%@", [resortsArray  objectAtIndex:row]];
        Ski_AdvisorAppDelegate *delegate = (Ski_AdvisorAppDelegate *)[[UIApplication  sharedApplication] delegate];
        [delegate.resortsNavController pushViewController:vailViewController animated:YES];
        [self.navigationController pushViewController:vailViewController animated:YES];
}

どうもありがとう!

4

3 に答える 3

0
if (self.vailViewController == nil) {
        VailViewController *vailView = [[VailViewController alloc]  initWithNibName:@"View" bundle:nil];
        self.vailViewController = vailView;
        [vailView release];
    }

このコード ブロックには、実際には "View.xib" という名前のビュー ファイルがあります。そうでない場合、これはクラッシュです。このエラーメッセージで

*キャッチされない例外 'NSInternalInconsistencyException' が原因でアプリを終了しています。

したがって、これを initWithNibName でロードしたい場合、ファイルは次のように命名されます。

VailViewController.h VailViewController.m VailViewController.xib

必要なもの:

VailViewController *vailView = [[VailViewController alloc]  initWithNibName:@"VailViewController" bundle:nil];

ただし、それが標準の UIViewController サブクラスである場合は、次のことだけを行う必要があります。

VailViewController *vailView = [[VailViewController alloc] init];

上記は、Xcode で UIViewController サブクラスを作成したばかりで、何も変更していない場合に機能します。ビューコントローラーは、独自のビューをロードする方法を知っています。.xib ファイルを作成し、その中の何かを削除した場合、またはファイルの所有者がインターフェイス バルダーの .xib ファイルのルート ビューに接続されていることを確認してください。

それが役立つことを願っています。

編集:

コメントのエラー:

*キャッチされていない例外 'NSInvalidArgumentException' が原因でアプリを終了しています。理由: '同じビュー コントローラー インスタンスを複数回プッシュすることはサポートされていません

あなたのコードに次の2行が来ています:

[delegate.resortsNavController pushViewController:vailViewController animated:YES];
[self.navigationController pushViewController:vailViewController animated:YES];

これらが 2 つの異なるナビゲーション コントローラーであるかどうかを確認する必要がありますか? もしそうなら、なぜ彼らはまったく同じView Controllerをプッシュする必要があるのですか?

それらの1つを削除すると、ビューコントローラーがエラーなしでプッシュされます。

于 2011-11-07T03:52:19.303 に答える
0

aBookDetail とは何ですか? あなたが思っているように、VailViewController をスタックにプッシュしていないようです。以下のコードは、あなたが望むものかもしれません。また、デバッガーはクラッシュに関するエラー情報を提供しますか?

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    NSInteger row = [indexPath row];
    if (self.vailViewController == nil) {
        VailViewController *vailView = [[VailViewController alloc]  initWithNibName:@"View" bundle:nil];
        self.vailViewController = vailView;
        [vailView release];
    }

    self.vailViewController.title = [NSString stringWithFormat:@"%@", [resortsArray  objectAtIndex:row]];
    Ski_AdvisorAppDelegate *delegate = (Ski_AdvisorAppDelegate *)[[UIApplication  sharedApplication] delegate];
    [delegate.resortsNavController pushViewController:self.vailViewController animated:YES];
}
于 2011-11-07T02:48:42.340 に答える
0

vailViewController が保持されていることを確認します。

@property (retain) VailViewController *vailViewController;

また、Ski_AdvisorAppDelegate の ResortsNavController は保持されますか? そのプロパティはどのように定義されていますか?

また、UITableViewController は UINavigationController の rootController ですか? もしそうなら、あなたは[self navigationController]を呼び出すことができるはずです

[[self navigationController] pushViewController:detailedView animated:YES];

私は通常、appDelegate でこれを行います。

_mainTableViewController = [[MainTableViewController alloc] init];
_navController = [[UINavigationController alloc] initWithRootViewController:_mainTableViewController];
于 2011-11-07T03:04:37.580 に答える