私はアプリを作成しようとしています。最初のステップは、viewControllers を作成してリンクすることです。ストーリーボードとスエージを使用してそれを行うことができることは知っていますが、古い学校の方法でやりたかった-つまり、コーディング
4つのView Controllerが含まれています
-MainViewController
-SettingsViewController
-RulesViewController
3 つのビュー コントローラーはContainerViewController
(4th viewController) (私が書いたカスタム コンテナー) を使用して管理されます。現在currentSubViewController
表示されているviewControllerを追跡します
@implementation ContainerViewController
{
UIViewController * currentSubViewController;
}
3 つの viewController はすべて .nib から作成されます
- メインページには「設定」と「ルール」の2つのボタンがあります
- 設定には、「メイン」と「ルール」の 2 つのボタンがあります。
- ルールには、「メイン」と「設定」の 2 つのボタンがあります。
始めるとき :
currentSubViewController が MainViewController のインスタンスに設定され、次に
[container addChildViewController: currentSubViewController]
コンテナを currentSubViewController の親にします。
そして、メインページは問題なく表示されます
「設定ボタン」を押して起動後
MainViewController の IBAction が呼び出されます
- (IBAction)onSettings:(id)sender {
if ([self parentViewController]) {
[(ContainerViewController*)[self parentViewController showViewControllerWithName:@"settings"];
}
}
そしてshowViewControllerWithName
ofContainerViewController
が呼び出されます
- (void) showViewControllerWithName:(NSString*)vctype
{
UIViewController * toVC = [ViewControllerFactory getViewControllerOfType:vctype]; // viewController factory returns the appropriate viewController i.e either MainViewController or SettingsViewController or RulesViewController
toVC.view.frame = containerView.bounds;
toVC.view.autoresizingMask = containerView.autoresizingMask;
[currentSubViewController willMoveToParentViewController:nil];
[self addChildViewController:toVC];
[self transitionFromViewController:currentSubViewController
toViewController:toVC duration:1.0 options:UIViewAnimationOptionCurveLinear animations:^{} completion:^(BOOL finished){
[currentSubViewController removeFromParentViewController];
[toVC didMoveToParentViewController:self];
}];
currentSubViewController = toVC;
// I checked here toVC has a parentViewController set to ContainerViewController
}
SettingsViewControllerが表示される
「メイン」ボタンを押したときSettingsViewController
SettingsMainController の IBACtion が呼び出されます
- (IBAction)onMain:(id)sender {
if ([self parentViewController]) { // parentViewController is nil here
[(ContainerViewController*)[self parentViewController] showViewControllerWithName:@"root"];
}
}
しかし、ParentViewController はここでは nil であるため、何も表示されません。SettingsViewController はshowViewControllerWithName
、前のステップの関数呼び出しからの toVC です。
showViewControllerWithName()
とOnMain()
の間のどこかparentViewController
が に設定されていnil
ます。私はviewDidAppearまでチェックし、その時点までparentViewControllerはnilではありませんでした。
私の質問は
- どこで
parentViewController
nilに設定されていますか? - この問題をデバッグするには、後で呼び出される他の内部関数を知りたいと思います
viewDidAppear
- ファクトリ クラスを使用して新しい UIViewControllers を作成すると問題が発生しますか?
- 作成されているインスタンスと表示されているインスタンスは異なりますか?デバッガーでメモリアドレスを確認しましたが、同じです
これを修正できません。派生クラスの親を追跡する非常にハックな方法を試してみましたが、transitionFromViewController:
両方のビューコントローラーが同じ親を持つ必要があるという例外がスローされました。
私はこれでほぼ2日間立ち往生しています。助けていただければ幸いです。