0

画面上で UINavigationController とカスタム UIViewController を一緒に保持するコンテナー ビュー コントローラーを作成しようとしています。

私はそれをテスト プログラムに配置しましたが、完全に動作しますが、実際のプロジェクトに実装しようとすると、含まれているビュー コントローラーの外観メソッドが呼び出されません。

働くテスト:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

MasterStatusViewController *master = [[MasterStatusViewController alloc] init];
[self.window setRootViewController:master];

self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;
}

- (void)viewDidLoad {

[super viewDidLoad];

InventoryViewController *newInventory = [[InventoryViewController alloc] init];
self.navigation = [[UINavigationController alloc] initWithRootViewController:newInventory];
self.statusRibbon = [[StatusBarViewController alloc] initWithNibName:@"StatusBarViewController" bundle:nil];

[self addChildViewController:self.navigation];
self.navigation.view.frame = self.navigationView.frame;
[self.view addSubview:self.navigation.view];
[self.navigation didMoveToParentViewController:self];

[self addChildViewController:self.statusRibbon];
self.statusRibbon.view.frame = self.ribbonView.frame;
[self.view addSubview:self.statusRibbon.view];
[self.statusRibbon didMoveToParentViewController:self];
}

失敗したプロジェクト:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor whiteColor];

MasterViewController *master = [[MasterViewController alloc] init];
self.centerController = master;

[self.window setRootViewController:master];

[self.window makeKeyAndVisible];
return YES;
}

- (void)viewDidLoad {

[super viewDidLoad];

LoginViewController *login = [[LoginViewController alloc] init];
self.navigation = [[UINavigationController alloc] initWithRootViewController:login];
self.statusRibbon = [[StatusRibbonViewController alloc] init];

[self addChildViewController:self.navigation];
self.navigation.view.frame = self.navigationView.frame;
[self.view addSubview:self.navigation.view];
[self.navigation didMoveToParentViewController:self];

[self addChildViewController:self.statusRibbon];
self.statusRibbon.view.frame = self.ribbonView.frame;
[self.view addSubview:self.statusRibbon.view];
[self.statusRibbon didMoveToParentViewController:self];
}

ビューは正しく配置され、外観メソッドが呼び出されないことを除いて、期待どおりに実行されます。私はかなり困惑しています。メソッドを手動で呼び出すことは、これらの呼び出しも行われないため、解決策ではないようです。

編集:外観方法とは、viewWillAppear、viewDidAppearなどを意味します。

2番目の編集:

~中略~

3番目の編集:さらに調べたところ、外観ライフサイクルメソッドが呼び出されていない理由は、コンテナビューコントローラーでも呼び出されていないためだと思います。追加した

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    NSLog(@"MasterViewController VIEW WILL APPEAR");
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    NSLog(@"MasterViewController VIEW DID APPEAR");
}

なんらかの理由で呼び出されmasterViewControllerません。

4

3 に答える 3

5

解決しました。マスターの外観メソッドが呼び出されなかった理由はわかりません.xcodeをいくつかクリーンアップすると、その問題が解決したようです。

ただし、これらのメソッドはまだ他のビュー コントローラーに転送されていませんでした。次に、このリンクに出くわし、何があっても常にアピアランス コールを転送する必要があることを知りました。以下を追加することで修正できました。

- (void)viewWillAppear:(BOOL)animated {

    [super viewWillAppear:animated];
    [self.navigation beginAppearanceTransition: YES animated: animated];
}

- (void)viewDidAppear:(BOOL)animated {

    [super viewDidAppear:animated];
    [self.navigation endAppearanceTransition];
}

-(void) viewWillDisappear:(BOOL)animated {

    [super viewWillDisappear:animated];
    [self.navigation beginAppearanceTransition: NO animated: animated];
}

-(void) viewDidDisappear:(BOOL)animated {

    [super viewDidDisappear:animated];
    [self.navigation endAppearanceTransition];
}

- (void)didReceiveMemoryWarning {

    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
于 2013-02-01T19:21:13.193 に答える
3

ビューに新しい子View Controllerを追加するたびに外観メソッドが転送されないUIViewControllerの封じ込め機能を使用していたという同様の問題がありました。

サブビューを追加する前に beginAppearanceTransition:animated: を呼び出し、完了したら endApperanceTransition を呼び出す必要があることがわかりました。サブビューを追加するとき、および外観メソッドをトリガーするためにサブビューを削除するときに、これを行う必要があります。

あなたの場合、私は次のようなことを試してみます:

self.navigation.view.frame = self.navigationView.frame;
[self addChildViewController:self.navigation];
[self.navigation didMoveToParentViewController:self]
[self.navigation beginAppearanceTransition:YES animated:NO];
[self.view addSubview:self.navigation.view];
[self.navigation endAppearanceTransition];

self.statusRibbon.view.frame = self.ribbonView.frame;
[self addChildViewController:self.statusRibbon];
[self.statusRibbon didMoveToParentViewController:self]
[self.statusRibbon beginAppearanceTransition:YES animated:NO];
[self.view addSubview:self.statusRibbon.view];
[self.statusRibbon endAppearanceTransition];
于 2013-09-11T22:19:00.037 に答える
0

「出現方法」とは正確には何を意味しますか?ビューが表示されないということですか?

実際の例では、nib ファイルからリボン ビューを読み込んでいます。

self.statusRibbon = [[StatusBarViewController alloc] initWithNibName:@"StatusBarViewController" bundle:nil];

init 2 番目のコード例では、次のようにします。

self.statusRibbon = [[StatusRibbonViewController alloc] init];

後者は「新鮮な」ビューを作成するだけであり、それが表示されないという認識につながる可能性があります。

于 2013-01-31T18:15:52.260 に答える