iOS - 为什么我不能以两次相同的方式使用pushViewController?

时间:2014-01-01 03:55:39

标签: ios objective-c xcode

我目前有三个视图控制器:ViewController1 ViewController2ViewController3。我正在尝试在ViewController1ViewController2之间以及ViewController2ViewController3之间传递数据。

例如,要将数据user保留从ViewController1传递到ViewController2我使用:

ViewController2 *vc2 = [[ViewController2 alloc]init];
vc2.user = _user;    

[self.navigationController pushViewController:vc2 animated:YES];

但如果我尝试从userViewController2传递ViewController3,我就无法使用上述方法...我只是在屏幕上显示黑色视图控制器。< / p>

相反,我试过这个并且它有效:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
ViewController3 *vc3 = [storyboard instantiateViewControllerWithIdentifier:@"vc3Storyboard"];

vc3.user = _user;

[self.navigationController pushViewController:vc3 animated:YES]; 

为什么我不能使用与vc1相同的方法 - &gt; VC2?

ViewController3 *vc3 = [[ViewController3 alloc]init];
vc3.user = _user;

[self.navigationController pushViewController:vc3 animated:YES];

3 个答案:

答案 0 :(得分:2)

您获得黑屏的原因是因为您使用的方法来实例化它。

 ViewController2 *vc2 = [[ViewController2 alloc]init];

这成功创建了一个视图控制器,但是,它没有视图(你没有给它一个)。导航控制器将无视图视图控制器添加到其堆栈,为以前的控制器设置动画。由于导航控制器的默认背景颜色为黑色且顶视图控制器不存在,因此您正在体验应该显示的内容:无。

你的第二个方法有效的原因是故事板正在实例化视图控制器,但这次它有一个实际的视图:

ViewController3 *vc3 = [storyboard instantiateViewControllerWithIdentifier:@"vc3Storyboard"];

答案 1 :(得分:0)

首先你必须发起你的viewController,因为@Wayne Hartman说..

ViewController2 * vc = [self.storyboard instantiateViewControllerWithIdentifier:@"ViewController2"];
vc.user = _user;
[[self navigationController] pushViewController:vc animated:YES];

现在,您的ViewController2ViewController3变量“user”必须有@Property@synthesize

@property(nonatomic, copy) NSString *user;
@synthesize user;

现在,您可以使用与ViewController3

相同的ViewController2导航
ViewController3 * vc = [self.storyboard instantiateViewControllerWithIdentifier:@"ViewController3"];
vc.user = user;
[[self navigationController] pushViewController:vc animated:YES];

您可以从ViewController Identifier

中找到Storyboard > Identity inspector

enter image description here

答案 2 :(得分:0)

您可以使用此代码

        NSMutableArray* array = [self.navigationController viewControllers];
        FirstViewController* viewFirst = [array objectAtIndex:0];
        // Get the third / second or any view controller using its order of insertion / push
        // If you know th order then
        ThirdViewController* thirdView = [array objectAtIndex:2];
        thirdView.view.backgroundColor = viewFirst.view.backgroundColor;

如果不起作用

您可以使用NSNotification执行任务