7

概要として、ビューがスタックからポップされるたびに viewWillAppear を呼び出す UITabBarController 内の UINavigationController に問題があります。

デリゲートから、UITabBarController がプログラムで作成されます。

// Create views for Tab Bar
    UINavigationController *view1   = [[UINavigationController alloc] initWithRootViewController:[[newsFeedNavigationController alloc] initWithStyle:UITableViewStylePlain]];
    resizedTabBatItem *tabBarItem1 = [[resizedTabBatItem alloc] initWithTitle:nil image:[UIImage imageNamed:@"newspaper.png"] tag:0];
    [view1 setTabBarItem:tabBarItem1];
    [tabBarItem1 release];

    UIViewController *view2   = [UIViewController new];
    resizedTabBatItem *tabBarItem2 = [[resizedTabBatItem alloc] initWithTitle:nil image:[UIImage imageNamed:@"speechbubble.png"] tag:1];
    [view2 setTabBarItem:tabBarItem2];
    [tabBarItem2 release];

....

// Create the tab bar controller
    bookTabBarController = [BookTabBarController new];
    [[bookTabBarController view] setFrame:CGRectMake(0, 0, 320, 460)];

    // Add the views to it
    NSArray *viewControllers = [NSArray arrayWithObjects:view1, view2, view3, view4, view5, nil];

    [[bookTabBarController tabBarController] setViewControllers:viewControllers];

私の newsFeedNavigationController は単なるサブクラス化された UITableViewController です (サブクラスは、newsFeedNavigationController で呼び出されることはないため、viewWillAppear に干渉していません)。その中で、クリックすると新しい UIViewController をスタックにプッシュするアイテム。

問題は、ビューがスタックからポップされるたびに、newsFeedNavigationController で viewWillAppear が呼び出されず、リスト内の項目が強調表示されたままになることです。私はこれを数時間いじっていましたが、何が間違っているのかを知るために助けが必要なところです。

私の newsFeedNavigationController で、NSLog を追加して、それが呼び出されたかどうか、または何かを実行したかどうかを確認しようとしましたが、呼び出されることさえありません。

- (void)viewWillAppear:(BOOL)animated {
    NSLog(@"is viewWillAppear called?");
    [super viewWillAppear:animated];
}

編集:

さて、ここで私が気づいた奇妙なことがあります:

私が実行した場合:

[self presentModalViewController:(any UIview) animated:YES];

ビューをポップしてプッシュすると、viewWillAppearが適切に機能し始めます...だから今、私は困惑しています。それは実際には解決策ではありませんが、進行中の何かの内部である可能性があります。

4

5 に答える 5

1

この問題の解決策は、UINavigationController を含む UIViewController に目的のメッセージを渡すことです。UINavigationController はメッセージを適切なビュー コントローラーに転送します。直感に反するようですが、機能します。

@interface NavigationWrapperViewController : UIViewController {
    // navigationController must be a subview of this view controller's view
    UINavigationController *navigationController;
}
@property (nonatomic, assign) UINavigationController *navigationController;
@end

@implementation NavigationWrapperViewController
@synthesize navigationController;

-(void)viewWillAppear:(BOOL)animated {
    [navigationController viewWillAppear:animated];
}
-(void)viewDidAppear:(BOOL)animated {
    [navigationController viewDidAppear:animated];
}
-(void)viewWillDisappear:(BOOL)animated {
    [navigationController viewWillDisappear:animated];
}
-(void)viewDidDisappear:(BOOL)animated {
    [navigationController viewDidDisappear:animated];
}

@end

Pastebinでより完全な解決策を見つけることができます(私は投稿しませんでした)。

このソリューションを提供してくれたdavidbenini.itjaekwonに感謝します。

于 2010-09-20T19:02:10.780 に答える
1

もう 1 つの解決策は、ナビゲーション コントローラーのデリゲートを設定することです。デリゲート内で、次のメソッドを実装します。

- (void)navigationController:(UINavigationController *)navigationController  willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
    [viewController viewWillAppear:animated];
}

これにより、ビューがナビゲーション コントローラーに表示されようとしているビュー コントローラーで viewWillAppear が確実に呼び出されます。このようにすると、ビューがプッシュされているために表示されているか、サブビューがポップされているために表示されているかに関係なく、viewWillAppear が呼び出されます。

于 2010-06-28T00:39:19.960 に答える
1

私自身の質問に答えるために、問題が何であるかを知りました。

Apple の「UINavigationController 内に UITabBarController はありません」を順守するために、標準のビュー コントローラーに基づいた独自のタブ バー コントローラー (bookTabBarController) を作成しました。私の問題は、クラスがviewDidAppearをView Controllerを管理するクラスに渡していなかったため、表示されているかどうかがわからなかったことです。

于 2010-06-19T21:21:10.733 に答える
1

さらに簡単なトリック:

のサブクラスでUITabBarController、これをオーバーライドします。

-(void)loadView{

    [super loadView];

    //here goes the trick:
    [self setSelectedIndex:1];
    [self setSelectedIndex:0];
}
于 2012-09-19T03:01:32.763 に答える
0

OK、これは古い、非常に古いですが、ここで同様の問題が発生しました。

  UITabViewController
     UINavigationController
       UITableViewController1
         UITableViewController2

から飛び出すときUITableViewController2、 のviewWillAppear関数UITableViewController1は呼び出されませんでした。

問題:スーパー実装を呼び出さずUITabViewControllerにカスタム クラスをオーバーライドしていました。viewWillAppear

于 2016-07-19T01:51:20.590 に答える