1

ストーリーボードから構築されたナビゲーションコントローラーを備えたアプリがあります。各ViewControllerには、ユーザーが次のビューに戻るたびに更新する必要があるテーブルがあるため、ユーザーがView Controller A-> B-> Cのようになったら、BIに戻ったときに更新する必要があるとします。ビューBのテーブルの値。

UINavigationControllerDelegateを使用してこれを実行しようとしているので、ユーザーがナビゲーションを行ったり来たりするたびにdidShowViewControllerが呼び出されます。

- (void) navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    // Do some initialization stuff
    // and then get entries from an external database

   [self fetchEntries];

   // Log:
   NSLog(@"View-B: \nself=%@ \nnavigationController=%@\nDelegate:%@\nviewControllers:%@", self, self.navigationController, self.navigationController.delegate, self.navigationController.viewControllers);
}

viewDidLoadにデリゲートを設定しました。

- (void)viewDidLoad 
{
    [super viewDidLoad];

    // Sets the delegate for Navigation Controller
   [self.navigationController setDelegate:self];   
}

問題は、何らかの理由で、navigationControllerがどこかでNULLに設定されていて、明示的なプッシュ/ポップ操作を行っていないため、どこにあるかがわからないことです(ナビゲーションコントローラーはストーリーボードに組み込まれていると述べました)。

正確なシーケンスは次のとおりです。A->B->C-> Bここで、navigationControllerはNULLです。NSLogの出力は次のとおりです。

1)ユーザーがA->Bから移動した場合

2012-10-07 14:50:28.170 MyApp[35765:207] View-B: 
self=<View-B: 0x6a660b0> 
navigationController=<UINavigationController: 0x6823b20>
Delegate:<View-B: 0x6a660b0>
viewControllers:(
    "<View-A: 0x6879e90>",
    "<View-B: 0x6a660b0>"
)

2)B-> C

2012-10-07 14:50:31.371 MyApp[35765:207] View-C: 
self=<View-C: 0x6a69a10> 
navigationController=<UINavigationController: 0x6823b20>
Delegate:<View-C: 0x6a69a10>
viewControllers:(
    "<View-A: 0x6879e90>",
    "<View-B: 0x6a660b0>",
    "<View-C: 0x6a69a10>"
)

3)そしてC-> B

2012-10-07 14:50:37.027 MyApp[35765:207] View-C: 
self=<View-C: 0x6a69a10> 
navigationController=(null)
Delegate:(null)
viewControllers:(null)

ここでnavigationControllerがNULLになる理由がよくわかりません。viewDidLoadでデリゲートを設定すると、問題が発生することがわかりました。その行を削除し、プロトコルプロシージャ(didShowViewController)からviewDidLoadにコードを移動すると、ユーザーがナビゲーションスタックに戻ったときにテーブルを更新できないことを除いて、すべてが正常に機能します。

また、ステップ(3)で、didShowViewControllerがView-BからではなくView-Cから呼び出されていることも奇妙です。

どんな助けでも大歓迎です。

4

1 に答える 1

0

[self.tableviewreloadData]を呼び出す必要があると思います。viewControllerBのviewWillAppearで。

于 2012-10-07T18:33:10.983 に答える