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

12 浏览
0 Comments

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

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

例如,要将ViewController1中的数据user传递给ViewController2,我使用以下代码:

ViewController2 *vc2 = [[ViewController2 alloc]init];
vc2.user = _user;    
[self.navigationController pushViewController:vc2 animated:YES];

但是,如果我尝试从ViewController2传递userViewController3,我不能使用上述方法...屏幕上只会出现一个黑色的视图控制器。

相反,我尝试了以下方法,它可以正常工作:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
ViewController3 *vc3 = [storyboard instantiateViewControllerWithIdentifier:@"vc3Storyboard"];
vc3.user = _user;
[self.navigationController pushViewController:vc3 animated:YES]; 

为什么我不能使用我在vc1 -> vc2中使用的相同方法?

ViewController3 *vc3 = [[ViewController3 alloc]init];
vc3.user = _user;
[self.navigationController pushViewController:vc3 animated:YES];

0
0 Comments

问题出现的原因是因为第一种方法中实例化的视图控制器没有视图。导航控制器会将没有视图的视图控制器添加到其堆栈中,将前一个视图控制器动画移出。由于导航控制器的默认背景颜色是黑色并且顶部视图控制器不存在,所以你看到的结果是什么都没有。

第二种方法之所以有效是因为故事板实例化的视图控制器有一个实际的视图。

0
0 Comments

问题:为什么我无法连续两次使用pushViewController方法?

原因:在iOS中,pushViewController方法只能用于将一个视图控制器推入导航栈中一次。如果尝试连续两次使用该方法,第二次调用将无效。

解决方法:可以通过以下两种方式解决该问题:

1. 使用以下代码获取导航控制器的视图控制器数组,并通过索引位置获取需要的视图控制器:

NSMutableArray* array = [self.navigationController viewControllers];
FirstViewController* viewFirst = [array objectAtIndex:0];
ThirdViewController* thirdView = [array objectAtIndex:2];
thirdView.view.backgroundColor = viewFirst.view.backgroundColor;

2. 如果第一种方法不起作用,可以使用NSNotification来完成任务。

0
0 Comments

问题:为什么我无法像第一次那样使用pushViewController?

问题的原因是,在使用pushViewController之前,需要先初始化你的viewController。具体的解决方法如下:

首先,根据Hartman的说法,你必须初始化你的viewController:

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

然后,在你的ViewController2和ViewController3中,变量"user"必须如下所示:

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

现在,你可以像在ViewController2中一样导航到ViewController3:

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

你可以从Storyboard的Identity inspector中找到ViewController的标识符:

![enter image description here](https://i.stack.imgur.com/h0r2Z.png)

通过以上步骤,你就可以解决无法再次使用pushViewController的问题了。

0