1

我正在开发一个具有 TableView 的应用程序。当我按下任何单元格时,应用程序会转到下一个 ViewController。在这个 viewController 中,我通过代码创建了一个 TabBarController,它有 3 个子 ViewController。所以,我想将一个变量从 TableView 传递给 TabBar 的子项。我可以将变量传递给 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 

有人知道为什么我可以先查看儿童 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 输出向我们显示,第二个选项卡的视图控制器在此之前正在记录其结果。这就是为什么nil第二个标签的视图控制器viewDidLoad记录它的原因,因为该日志是在标签栏控制器有机会设置值并自己记录之前发生的。

所以,有几种方法可以解决这个问题:

  1. 在分配 之前vc2.proId,您有一行无害的代码,上面写着:

    vc2.view.backgroundColor = [UIColor clearColor];
    

    那行代码触发加载第二个视图控制器的视图(并将viewDidLoad调用它)。如果您vc2.proId在开始访问任何vc2视图之前移动 to 的分配,这将改变您的NSLog语句出现的顺序(或者,更好的是,将背景颜色的设置移动到viewDidLoad子控制器的设置中)。

  2. 您可以创建自己的init方法来接受项目 ID 作为参数。这也将确保它是在之前设置的viewDidLoad。因此,YPProjectViewController可以有一个方法,例如:

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

关于自定义容器调用的两个不相关的观察:

  1. 当你打电话时addChildViewController,它会呼唤willMoveToParentViewController你。因此,您应该删除对willMoveToParentViewController. 请参阅该方法的文档

  2. 您甚至可能希望完全停用这些自定义容器调用,而只需创建, 本身YPTabBarViewController的子类UITabBarController,而不是UIViewController. 这完全消除了自定义容器调用的需要。显然,如果您对自定义容器有其他需求,请随意,但在此代码示例中它是多余的。

于 2013-10-01T12:42:29.113 回答