Objective-C:多场景-模态切换(present Modally)

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场景的属性:

((ViewController*)self.presentingViewController).xx=self.xx


测试结果

在场景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方法,为何?



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值