4

私はアプリを作成しようとしています。最初のステップは、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ではありませんでした。

私の質問は

  1. どこでparentViewControllernilに設定されていますか?
  2. この問題をデバッグするには、後で呼び出される他の内部関数を知りたいと思いますviewDidAppear
  3. ファクトリ クラスを使用して新しい UIViewControllers を作成すると問題が発生しますか?
  4. 作成されているインスタンスと表示されているインスタンスは異なりますか?デバッガーでメモリアドレスを確認しましたが、同じです

これを修正できません。派生クラスの親を追跡する非常にハックな方法を試してみましたが、transitionFromViewController:両方のビューコントローラーが同じ親を持つ必要があるという例外がスローされました。

私はこれでほぼ2日間立ち往生しています。助けていただければ幸いです。

4

2 に答える 2

1

さて、私はついにそれを機能させることができました。もう一度質問を簡潔に説明させてください

- >存在し、 ContainerViewControllerMainViewController.ParentControllerMainViewController を確認すると、事実ですContainerViewController

->次の関数を使用してContainerViewControllerから に遷移MainViewControllerSettingsViewController

  (void) showViewControllerWithName:(NSString*)vctype
  {
     UIViewController * toVC = [ViewControllerFactory getViewControllerOfType:vctype]; 
    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;


}

→遷移後SettingsViewController.parentViewControllerはnil

以下は修正です:

           animations:^{} completion:^(BOOL finished){
                  [currentSubViewController removeFromParentViewController];
                  [toVC didMoveToParentViewController:self];

              }];

    currentSubViewController = toVC;

に変更されます

           animations:^{} completion:^(BOOL finished){

              }];
    [currentSubViewController removeFromParentViewController];
    [toVC didMoveToParentViewController:self];
    currentSubViewController = toVC;

そして今SettingsViewController、親がいます。

まあ、誰かが正確に何が起こっているのかを説明できれば、それは素晴らしいことです.

于 2014-04-03T20:29:54.037 に答える
0

ここで鳴らしたかっただけです。ある日までうまく機能していたストーリーボードを使用した親子レイアウトのセットアップがありました....

-(UIViewController*)addChildViewController:(UIViewController*)chidViewController という名前のユーティリティ メソッドを作成したことが判明しました。

メソッド名があまり独創的ではなく、UIViewController メソッドを上書きしてしまったことがわかりました。私がしなければならなかったのは、名前を変更するだけで、ビジネスに戻りました。これを追跡するのに長い時間がかかりました!

于 2016-07-06T00:28:01.013 に答える