Project:Hour11-20140914-01
一、属性访问
方式一:EditorVC 访问 InitVC 的属性:在EditorVC.h import InitVC.h
方式二:EditorVC 与 InitVC 互相访问,则需要多处设置:
1、EditorVC.h import InitVC.h
2、InitVC.h 中 import代码行后加入 @class "EditorVC.h"
3、InitVC.m 中 import Editor.h
二、手工切换切换
1、通过一个按钮,建立一个identifier=toEditorVC的segue
2、创建一个按钮及与之对应的IBAction,调用UIViewController的实例方法performSegueWithIdentifier:sender
- (IBAction)seguetoeditorvc:(id)sender {
[self performSegueWithIdentifier:@"toEditorVC" sender:self];
}
3、关闭场景:调用UIViewController的实例方法dismissViewControllerAnimated:completion
- (IBAction)dismissVC:(id)sender {
[self dismissViewControllerAnimated:YES completion:nil];
}
其中参数1YES=与原segue相同的动画模式返回,NO是无动画
参数2=过渡完毕后将执行的代码块
三、出口(exit)、回退(unwind)、回退切换(高级)
1、回退:1切换到2,2切换到3,3切换到4,4可以直接回退到1,只需要在1声明+实现方法
-(void)toInitVC:(UIStoryboardSegue *)sender{//NSLog(@"空方法即可");
}
然后将回退按钮与出口关联,选择该方法即可。
2、回退切换:canPerformUnwindSegueAction:fromViewController:withSender
四、编程方式创建场景切换
也就是不建立segue,整个按钮方法即可
待总结:
1、import 需要切换到得目标viewcontroller的类(比如说EditorViewController),如图:
2、手工创建模态切换(最后一行顺带实现了传值)
- (IBAction)toEditorVCbyCoding:(id)sender {
//实例化一个指向项目文件Main的UIStoryboard对象mainStoryboard
UIStoryboard *mainStoryboard=[UIStoryboard storyboardWithName:@"Main" bundle:nil];
//实例化一个EditorViewController对象,使用UIStoryboard的方法instantiateViewControllerWithIdentifier
EditorViewController *editorVC=[mainStoryboard instantiateViewControllerWithIdentifier:@"EditorScene"];
//配置模态显示样式(Transition & presentation---Ipan才有)
editorVC.modalTransitionStyle=UIModalTransitionStyleFlipHorizontal;
editorVC.modalPresentationStyle=UIModalPresentationFullScreen;
[self presentViewController:editorVC animated:YES completion:nil];
((EditorViewController *)self.presentedViewController).textfield_share.text=self.textfield1.text;
}
五、场景间传递数据
A---->B
方法一:使用(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender。
1、在B场景定义公有属性:LabelStr_EditorVC
2、在A场景重载方法prepareForSegue,将场景A的值赋给LabelStr_EditorVC
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
if ([segue.identifier isEqualToString:@"toEditorVC"]){
ViewController *FirstVC;
EditorViewController *EditorVC;
FirstVC=(ViewController*)segue.sourceViewController;
//FirstVC=self;
EditorVC=(EditorViewController*)segue.destinationViewController;
//LabelStr_EditorVC为公有属性
EditorVC.LabelStr_EditorVC=FirstVC.textfield1.text;
}
}
3、在场景B的viewDidLoad,将场景B内的属性使用LabelStr_EditorVC赋值
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
self.textfield3.text=self.LabelStr_EditorVC;
}
------------------>
PS:上面的是传递NSString给NSString能成功,但传递NSString给控件的Text属性则不行,是为什么呢?如下:
EditorVC.textfield3.text=FirstVC.textfield1.text;
方法二:使用UIViewController的两个属性:presentingViewController和presentedViewController
例子:
A场景设置B场景的属性:
((EditorViewController*)self.presentedViewController).LabelStr_EditorVC=self.textfield1.text
B场景设置A场景的属性:
测试结果
在场景A:
[self presentViewController:editorVC animated:YES completion:nil];
NSLog(@"4presenting=%@",self.presentingViewController); //------------显示结果:4presenting=(null)
NSLog(@"4presented=%@",self.presentedViewController); //------------显示结果:4presented=<EditorViewController: 0x7fda83d9fe10>
即,self.presentedViewController在执行切换后获取到目标场景ViewController的实例对象
切换到场景B:
ViewDidLoad时还没获取,之后viewWillAppear才获取到原始场景ViewController的实例对象
-(void)viewWillAppear:(BOOL)animated{
NSLog(@"5presenting=%@",self.presentingViewController); //----显示结果:5presenting=<ViewController: 0x7fda83f227b0>
NSLog(@"5presented=%@",self.presentedViewController); //----显示结果:5presented=(null)
}
因此可以将prepareForSegue与self.presentingViewController结合起来使用。
在场景A用prepareForSegue方法传值给场景B,在场景B用self.presentingViewController传值给A。
或者
在presentViewController后用self.presentedViewController访问目标场景的方法/属性,在viewWillAppear中用self.presentingViewController访问源场景的方法/属性
网友的方法:先用方法一,即:最简单的方式,使用属性传值,即:在B中声明一个A类的属性,在B弹出前,给B的此属性赋值就可以了
N、其他
1、将新建的ViewController关联到.h .m文件:
后补:新建cocaTouch class文件,自定义类为。。。。将新建ViewController的custom class设置为。。。
2、切换和回退的区别?
回退只能用在切换之后,如果没有切换则不能回退。
N+1、疑问:
1、点空白处,会自动调用dismissViewControllerAnimated方法,为何?