1

TableView を持つアプリケーションを開発しています。任意のセルを押すと、アプリは次の ViewController に移動します。このviewControllerでは、3つの子ViewControllerを持つコードでTabBarControllerを作成しました。そこで、TableView から TabBar の Children に変数を渡したいと思います。変数を TabBar に渡すことができます。NSlog 関数で監視しました。子ViewControllersにもNSlogの型があり、変数がnullであることは私にとって本当に奇妙ですが、出力では最初にこれが表示されます。

2013-10-01 03:01:40.687 Prototype[38131:c07] proId (null) // This is the children log from vc2 ViewController  "YPProjectViewController"
2013-10-01 03:01:40.697 Prototype[38131:c07] projectID 433 // This is the TabBar LOG YPTabBarViewController 

Children NSLogを最初に使用できる理由を誰かが知っていますか? たぶん、解決策があります。

#import "YPTabBarViewController.h"
#import "YPProjectViewController.h"
#import "YPCommentsViewController.h"
#import "YPProposalsViewController.h"

@interface YPTabBarViewController ()
@property (nonatomic,strong)UITabBarController *tabBar;
@end

@implementation YPTabBarViewController
@synthesize tabBar;
@synthesize projectId = _projectId;

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self setUpTabBar];

}

// Set up tabBar
-(void)setUpTabBar
{

        YPCommentsViewController *vc1 = [[YPCommentsViewController alloc] init];
        vc1.title = @"Comments";
        vc1.view.backgroundColor = [UIColor clearColor];
        UINavigationController *contentNavigationController = [[UINavigationController alloc] initWithRootViewController:vc1];

        YPProjectViewController *vc2 = [[YPProjectViewController alloc] init];
        vc2.title = @"Project";
        vc2.view.backgroundColor = [UIColor clearColor];

        vc2.proId = _projectId;
        NSLog(@"PROJECT ID %@", vc2.proId);
       // UINavigationController *contentNavigationController2 = [[UINavigationController alloc] initWithRootViewController:vc2];


        YPProposalsViewController *vc3 = [[YPProposalsViewController alloc] init];
        vc3.title = @"Proposal";
        vc3.view.backgroundColor = [UIColor clearColor];
        UINavigationController *contentNavigationController3 = [[UINavigationController alloc] initWithRootViewController:vc3];
        tabBar = [[UITabBarController alloc] init];
        tabBar.viewControllers = @[contentNavigationController,vc2,contentNavigationController3];
        tabBar.selectedIndex   = 1;

        [tabBar.view setAutoresizingMask:UIViewAutoresizingFlexibleHeight];
        [tabBar willMoveToParentViewController:self];
        [self addChildViewController:tabBar];
        [tabBar didMoveToParentViewController:self];
        [self.view addSubview:tabBar.view];

}

4

1 に答える 1

2

問題を理解するという点でNSLogは、「タブバーコントローラー」のステートメントは、vc2.proID設定直後の値をログに記録しています。しかし、NSLog の出力は、その 2 番目のタブのビュー コントローラーがその前に結果をログに記録していることを示しています。そのためnil、2 番目のタブのビュー コントローラーがviewDidLoadログを記録するのは、タブ バー コントローラーが値を設定してそれ自体をログに記録する前にログが発生するためです。

したがって、これを修正するにはいくつかの方法があります。

  1. の割り当ての直前にvc2.proId、次のような無害なコード行があります。

    vc2.view.backgroundColor = [UIColor clearColor];
    

    そのコード行により、2 番目のビュー コントローラーのビューが読み込まれます (そして、そのビューviewDidLoadが呼び出されます)。のいずれかのビューへのvc2.proIdアクセスを開始する前にの割り当てを移動すると、ステートメントが表示される順序が変更されます (または、背景色の設定を子コントローラーに移動することをお勧めします)。vc2NSLogviewDidLoad

  2. initプロジェクト ID をパラメーターとして受け入れる独自のメソッドを作成することもできます。これにより、 の前に設定されることも保証されviewDidLoadます。したがって、YPProjectViewController次のようなメソッドを持つことができます。

    - (id)initWithProjectId:(NSString *)projectId
    {
        self = [self init];
    
        if (self)
        {
            _proId = projectId;
        }
    
        return self;
    }
    

カスタム コンテナの呼び出しに関する 2 つの無関係な所見:

  1. を呼び出すとaddChildViewController、あなたを呼び出しwillMoveToParentViewControllerます。したがって、への呼び出しを削除する必要がありますwillMoveToParentViewControllerそのメソッドのドキュメントを参照してください。

  2. これらのカスタム コンテナ呼び出しを完全に廃止し、 .ではなく . 自体YPTabBarViewControllerのサブクラスを作成することもできます。これにより、カスタム コンテナー呼び出しを完全に行う必要がなくなります。明らかに、カスタム コンテナーに他のニーズがある場合は、お気軽にどうぞ。ただし、このコード サンプルでは冗長です。UITabBarControllerUIViewController

于 2013-10-01T12:42:29.113 に答える