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、坚持不要脸
原文地址:https://www.cnblogs.com/xulinmei/p/7420147.html