2013-10-01 28 views
1

我正在开发一个具有TableView的应用程序。当我按任何单元格时,应用程序会转到下一个ViewController。在这个viewController我创建了一个TabBarController的代码有3个子ViewControllers。所以,我想将一个变量从TableView传递给TabBar的子项。我可以将变量传递给TabBar,我已经用NSlog函数来观察它。对我来说,真的很奇怪,在子ViewControllers中,我也输入了一个NSlog并且该变量为null,但是在输出中我首先看到了这一点。在ViewController和TabBar子项之间传递数据

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]; 

}

+0

对不起,我编辑了这个问题。这是真的你说什么 – croigsalvador

+0

你的意思是? '@implementation YPProjectViewController - (id)init { self = [super init]; if(!self)return nil; NSLog(@“proId ID%@”,_proId); 回归自我; }' – croigsalvador

+0

但是,我没有看到它在初始化,我已经做到了这一点来显示你,我显示proId登录ViewDidLoad – croigsalvador

回答

2

在认识问题方面,你NSLog声明中的“标签栏控制器”设置后立即记录的vc2.proID值。但是你的NSLog输出告诉我们,第二个选项卡的视图控制器在之前记录了其结果。这就是为什么当第二个选项卡的视图控制器的viewDidLoad记录日志时,它是nil,因为该日志在标签栏控制器有机会设置值并记录它自己之前发生。

因此,有几个方法,你可以解决这个问题:

  1. 右您的vc2.proId转让前,你有代码无害线,说:

    vc2.view.backgroundColor = [UIColor clearColor]; 
    

    这条线的代码触发第二个视图控制器的视图被加载(并且它的viewDidLoad将被调用)。如果您将vc2.proId的作业移动到您开始访问vc2的任何视图之前,这将会更改您的NSLog语句出现的顺序(或者更好的是将子控制器的背景色设置为viewDidLoad)。

  2. 您可以创建自己的init方法,该方法接受项目ID作为参数。这也将确保它在viewDidLoad之前设置。因此,YPProjectViewController可以有一个方法,如:关于自定义容器调用

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

两个不相关的意见:

  1. 当你调用addChildViewController,它调用willMoveToParentViewController你。所以你应该删除电话willMoveToParentViewController。请参阅documentation for that method

  2. 你可能甚至想完全退休,这些定制容器调用,只是让YPTabBarViewControllerUITabBarController,本身就是一个子类,而不是UIViewController。这消除了完全自定义容器调用的需要。很明显,如果您对自定义容器有其他需求,那么请随意,但在此代码示例中是多余的。

+1

我要说的很像罗布在这里。我想补充一点,在这里设置的大多数控制器属性,我认为应由控制器自己处理。标题和背景色具体。当然,这些移除和遗嘱并不属于这里。我会推荐Rob的自定义发起者的想法,并且这些视图之间的任何其他通信应该通过委托/协议或NSNotification的方式进行处理。 –

+2

@DeanDavids同意。顺便说一句,这不仅仅是一个好的风格问题,但也有性能/内存的原因,没有这个标签栏控制器不尝试更新子控制器的“视图”对象。如果标签栏控制器访问每个子视图,它将预先加载所有这些视图。没有理由遭受这种(适度)打击。如果将这些视图更新推迟到相应子项的“viewDidLoad”,则在您绝对需要它们(例如,用户在该选项卡上轻击)之前,不会创建它们的视图。因此,启动速度更快,消耗的内存更少。 – Rob

相关问题