一、介绍(基础操作忽略)
push:是针对在Navigation(导航栏)下使用的
modal:模态窗口(只能对这个窗口操作,点击其他窗口没有响应的), 是可以在任何控制器使用的,主要有两种:
1.窗口弹出(弹出后,后面的视图不可用的,比如A弹出B,A不可用)
2.控制器的跳转
二、使用
1、push必须在Navigation下使用、
解释:按ctrl进行连线,分别连出push和modal
问题:点击push,报错
原因:因为push必须在Navigation下使用,我这个没有在这个环境下
2、如果没有在Navigation下使用modal是可以跳转的,而且还不需要任何代码
那么在使用modal怎么做出Navigation的效果呢?
效果:这样就可以返回到主视图了
注意:
dismissViewControllerAnimated
这个方法并不算返回上一层,正确的说是将现有视图隐藏,自然就会显示出上一层的视图出来,从而达到返回上一层的效果
3、实现不连线跳转
然后再主视图的.m文件写上这个代码,注意,刚才modal的连线要去掉
- (IBAction)modalClicked:(UIButton *)sender {
UIStoryboard *storyboard = self.storyboard;
FirstViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"jump"];
[self presentViewController:vc animated:YES completion:nil];
}
方便copy,附上代码
4、presentViewController 跳转 后视图是黑色
testViewController *vc = [[testViewController alloc] init];
[self presentViewController:vc animated:YES completion:nil];
解析:如果用以上的方法跳转,那么跳转后的视图是黑色的
原因:我觉得操作跳转是成功了,确实跳转到了指定的控制器,但是我们的控制器视图的显示是故事版绘制的,所以我们只是跳转了控制器,但是并没有找到指定的故事版把视图绘制出来
解决
UIStoryboard *storyboard = self.storyboard;
FirstViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"jump"];
[self presentViewController:vc animated:YES completion:nil];
这样才可以成功
5、代码操作
1.Navigation下操作:
//跳转到指定id的控制器(这里的id是指在故事板里设置控制器的id)
[self.navigationController pushViewController:vc animated:YES];
//返回到上一层视图
[self.navigationController popViewControllerAnimated:YES];
// 返回到根视图
[self.navigationController popToRootViewControllerAnimated:YES];
这里,同样有个问题,操作不当,就会出现跳转后黑色的情况
// 创建控制器对象要用这种方法创建
UIStoryboard *storyboard = self.storyboard;
FirstViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"jump"];
// 如果用这种,就会出现跳转后黑色
FirstViewController *vc = [[FirstViewController alloc] init];