4

この質問は非常に頻繁に寄せられますが、利用可能な回答がなくても解決できません。

私はiOS 5.1で作業しています。私のナビゲーション コントローラーは、タブ バー ビュー コントローラーの 1 つのタブです。行を選択すると新しいView Controllerがプッシュされるテーブルビューがあります。

この問題は、2 番目の行を選択したときにのみ発生し、ときどき発生します。定期的ではありません。プッシュされたビューは空白になります - viewWillAppear/viewDidAppearは呼び出されていません。ナビゲーション バーの戻るボタンをクリックすると、ルート ビューのviewWillAppear/viewDidAppearも呼び出されず、空白になります。

まったく同じ方法で、最初の行/2番目の行を選択してビューをプッシュしています。しかし、問題は 2 番目の行でのみ発生します。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    switch (indexPath.row) {
        case 0:
            AViewController *aObj = [[AViewController alloc] init];
            aObj.homeObj = self;
            [self.navigationController pushViewController:aObj animated:YES];
            [aObj release];
            break;
        case 1:
            BViewController *bVCObj = [[BViewController alloc] init];
            bVCObj.homeObj = self;
            [self.navigationController pushViewController:bVCObj animated:YES];
            [bVCObj release];
            break;
        default:
            break;
    }
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
}

これこれを試しましたが、無駄でした。

  1. viewDidLoadを押すと が呼び出されていますが、BViewControllerは呼び出されていません。以下は私のものです:viewWillAppearviewDidAppearviewDidLoad

    - (void)viewDidLoad
    {
        [super viewDidLoad];
        self.view.backgroundColor = [UIColor blackColor];
        NSLog(@"nav stack: %@", [self.navigationController viewControllers]);
        NSLog(@"nav stack: %@", [[self.navigationController visibleViewController] description]);
        //some initialization and call of methods
    }
    
  2. 定期的ではありません。時々、このシナリオが発生します。これは、アプリをバックグラウンドから閉じて再起動するまで続きます。しかし、時々それはうまくいきます。View Controllerをnabスタックにプッシュしているだけです。

  3. コメントで述べたように、タブバーコントローラーの通常のナビゲーションコントローラーです。

4

1 に答える 1

0

AViewControllerとのビューをどのように定義していますBViewControllerか? initWithNibName一般的には、たとえばを使用します

AViewController *aObj = [[AViewController alloc] initWithNibName:@"mynibname" bundle:nil]`

Carl が指摘したように、明らかに just を使用できますが(ただし、これはClass Referenceinitに記載されていません)、システムは NIB ファイルの名前に非常にこだわるでしょう。ただし、ドキュメントには、NIB 名にa を使用して渡すことができると書かれています。個人的には、結果に一貫性がない場合は、NIB の名前を使用して明示的に渡し、状況が修正されるかどうかを確認します。UIViewControllerinitWithNibNamenilinitWithNibName

loadViewまたは、2 つのコントローラーでプログラムによってビューを構築していますか? 次に、それらのルーチンを表示する必要がありloadViewます ( と混同しないでくださいviewDidLoad)。

しかし、ドキュメントによると、NIB を指定するか、loadView. クラス リファレンスのビュー管理の説明を参照してください。UIViewController

アップデート:

あなたのフィードバックを踏まえて、私はいくつかの考えを持っています:

  1. 言うまでもなく、問題は明らかに上記のコードとは関係ありません。検索を広げて、より多くのコードを表示する必要があります。あなたviewDidLoadのBを見せてくださいませんか?

  2. 通常、この種のイベントが発生しないのは、ビュー コントローラーの階層がビューの階層と同期していないためです。人々がこれを行う最も一般的な方法は[addSubview someNewController.view]、ある時点で " " のようなことをした場合です。(a) アプリ デリゲートの初期構成以外のコンテキストで View Controller を使用している場合。(b) presentViewController(または却下); または (c) pushViewController(またはポップ) の場合は、自分が行ったことを共有することをお勧めします。

  3. andreamazz が指摘したように、「私のナビゲーション コントローラーはタブ バー コントローラーのビュー コントローラー内にあります」というコメントは、文字通りに読むと少し気がかりです。ナビゲーション バーをビュー コントローラーのビューに配置することはできますが、ナビゲーション コントローラーをビュー コントローラーに配置することはできません (まったく別の獣であるビュー コントローラーのコンテインメントを行っている場合を除きます)。同様に懸念されるのは、別の質問で、「UIViewController に UINavigationController または UITabBarController (私の場合) を埋め込むと、これらのメソッドの呼び出しが何らかの形で中断される」と言ったことです。つまり、nav コントローラーを他のビュー コントローラーに埋め込むのではなく (それ自体がタブ ビュー コントローラーなどのコンテナー コントローラーでない限り)、むしろその逆です。

  4. 珍しいことですが、プロジェクトが破損して奇妙な状態になってしまったことがあります。少なくとも、「製品」-「クリーン」と再構築を提案するかもしれません。問題が解決せず、問題を B の NIB に切り分けた場合は、一時的に名前を変更して、迅速で汚れたものを最初から作成します。

于 2012-09-01T07:08:20.327 に答える