zoukankan      html  css  js  c++  java
  • ios 故事版

    故事版 Storyboard(不能通过segue返回前面的界面,要用代码实现)

    背景
    xib无法快速了解多个xib界面之间的呈现顺序
    程序中会有大量的initWithNibName代码
    为了解决上述问题,才推出故事版,故事版同时也能大大提高工作效率,但是多人合作开发及后期迭代会比较麻烦

    启动时,系统自动做了什么?

    1.根据target中配置加载Main.storyboard
    2.自动创建window对象
    3.自动创建故事版中有启动箭头指向的那个场景背后视图控制器实例
    4.将创建好的视图控制器设置为window的rootViewController,然后显示window

    术语:

    1.故事版的每一个看的见的界面,叫场景 Scene, 每个场景都可以绑定一个视图控制器的类
    2.故事版中看到的连线,叫过渡 或 跳转 Segue,Segue是一个实例,可以自定义(不可以在window上直接拉segue)

    基本使用

    **1. **如何设置启动界面

    方案一:有箭头时,直接拖拽到目标VC即可(启动界面)
    方案二:有箭头时或没有箭头时,都可以选中场景上的小黄点(VC) -> 第四个
    检查器(属性) -> 勾选 is Initial View Controller(设置起始界面)

    **2. **如何完成从一个vc到另一个vc的跳转(同一storyboard下)
    选中源VC中触发跳转的控件(button / touchBegain…..) -> 按住contol -> 连线到目标VC ->在弹出的菜单中,选择 push(带导航)或modal(present)

    **3. **如何为界面中的场景绑定控制器?(添加代码)
    选中场景的小黄点 (viewController)-> 第三个检查器 -> 修改Class(创建一个实例,将实例名称添加到class中)

    **跳转 **

    1.通过Segue跳转

    **a **明确跳转源头:明确的知道跳转是由于哪个控件的事件触发的;

    • 实现方式:无需写代码,直接连线,选择 push(带导航)或modal(present)

    **b **不明确跳转源头:场景中无法确定触发跳转的控件具体是谁;

    • 实现方式:先选中跳转源VC小黄点(viewController) -> 按住control -> 到目标控制器上, 选中中间的连线 -> 第四个检查(属性) -> 设置 identifier 属性为这根线起个名字, 为跳转事件代码 调用 控制的 perFormSegueWithIndentifier方法 + identifier 来完成跳转

    不明确源头:
    不知道怎么拉segue(1个视图控制2个视图)
    touch方法,cell
    在故事版中不显示控件的跳转
    例如:

    不在故事版中的button:
    -(void)click:(UIButton *)sender{
        [self performSegueWithIdentifier:@"goGreenVc" sender:nil];
    }
    点击屏幕:
    -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
        //不明确跳转源头
        //通过 goRedVc 找到 segue ,然后跳转到 segue 目标控制器
        [self performSegueWithIdentifier:@"goRedVc" sender:nil];
    }
    (验证)
    
    2.跳转到故事版独立的一个场景(与当前场景无segue)

    **step1: **先给独立的场景在第三个检查器中起一个名字 :identity: storyboard ID :Mystoryboard
    **step2: **在想要跳转时,利用故事版的instantiateViewControllerWithIdentifier根据名字,创建目标场景实例
    **step3: **使用 push 或 present 进行跳转即可

    **通过一个button 来实现跳转到另一个故事版:
    **(在本scene上添加控制器即在class上添加MyViewController, 关联button后在实现跳转)

    //跳转到独立的场景
    - (IBAction)goAloneVC:(id)sender {
        //通过场景的 Identifier 在故事版中找到该场景,并创建场景绑定的控制器实例
        UIViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"AloneVC"];
        [self presentViewController:vc animated:YES completion:nil];
    }
    
    3.从故事版中跳转到其它的xib中

    **step1: **使用initWithNibName方法创建控制器实例
    **step2: **使用 push 或 present 进行跳转即可

    //跳转到xib创建的场景
    - (IBAction)goXibVC:(id)sender {
        MyViewController *myVC = [[MyViewController alloc]initWithNibName:@"MyViewController" bundle:nil];
        [self presentViewController:myVC animated:YES completion:nil];
    }
    
    4.从故事版中跳转到其它故事板中

    step1:通过名字把其他故事板实例创建出来:
    **step2: **获取故事板中带启动箭头的控制器实例:instantiateInitialViewController
    step3:修改window的rootViewController为控制器实例

    注意:
    要跳转到的故事版一定要带箭头,即要有开始界面
    storyboard也由delegate属性
    通过改变rootViewController来改变指向,释放之前故事版的队列空间(button关联一个方法)

    - (IBAction)goOtherStoryboard:(id)sender {
        UIStoryboard  *sd  = [UIStoryboard storyboardWithName:@"MyStoryboard" bundle:nil];
        UIViewController *vc =  sd. instantiateInitialViewController;
    //    [[UIApplication sharedApplication].keyWindow];  ?????
        self.view.window.rootViewController = vc;
    }
    
    
    5. 跳转传值:

    在存在多个present/push跳转传值时需要将segue截断将值传过去:(判别是哪个segue)

    //重写父类的方法  通过segue跳转时 会自动调用
    //segue 参数 就是跳转时的那条线
    -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
        if ([segue.identifier isEqualToString:@"goBlueVc"]) {
            //把线的目标控制器 获取出来
            MyViewController *myVC = segue.destinationViewController;
            myVC.content = self.textField.text;
            //    myVC.delegate = self;
            myVC.backValueBlock = ^(NSString *content) {
                self.label.text = content;
            };
        }else {
            RedViewController *redVC = segue.destinationViewController;
            redVC.redContent = self.textField.text;
        }
    }
    
    成功的三大原则: 1、坚持 2、不要脸 3、坚持不要脸
  • 相关阅读:
    Ehcache2 的配置(不使用配置文件)
    约定优于配置
    Eclipse 3.5使用dropins的插件安装方式
    程序开发为什么要使用框架
    关于远程连接MySQL数据库的问题解决
    python使用open经常报错:TypeError: an integer is required的解决方案
    python仿微软记事本
    抓取oschina上面的代码分享python块区下的 标题和对应URL
    单词翻译
    python多线程下载
  • 原文地址:https://www.cnblogs.com/xulinmei/p/7420147.html
Copyright © 2011-2022 走看看