zoukankan      html  css  js  c++  java
  • iOS Storyboard unwind segues使用小结

    使用storyboard开发的时候,经常会在一个scene上添加一个button,再拖拽这个button到某个想要关联的页面,最后选择push的方式跳转。这样scene_A和scene_B就有了一个“顺序”的跳转方式了。但有时,希望可以从scene_B触发某个action,跳转回scene_A。如果还采用刚才的方式,就会有问题。因为,跳回的那个scene_a已经不是原来的那个scene_A了。这就需要使用到storyboard的unwind segue了。写个demo小总结一下:

    创建如下图所示的storyboard。 RedViewController push到 YellowViewController, YellowViewController push到BlueViewController, BlueViewController modal到 GreenViewController。从YellowViewController可以返回RedViewController,从BlueViewController可以返回YellowViewController和RedViewController。当然,从GreenViewController也是可以返回到BlueViewController的。

    回到代码部分。因为使用了storyboard,push、model的跳转都省去了写代码,同理,“返回”的跳转也是省去了代码的。

    RedViewController.m中

     

    - (IBAction)unwindSegueToRedViewController:(UIStoryboardSegue *)segue {

        

    }

    需要注意的是这个方法的返回值必须是ibaction,参数必须是uistoryboardsegue。至于为什么,后面的代码会有体现。

    回到storyboard文件,观察到RedViewController的scene下方有个绿色的按钮(不是因为写了上面的代码才出现绿色按钮,而是一直都存在的)。



    接下来,右键exit按钮(绿色按钮),就会出现刚才写的方法unwindseguetoredviewcontroller:


    选中这个方法,拖拽至YellowViewController的back redvc按钮。


    放手之后,会在back redvc附近出现一个action的提示,选中。这样,当点击yellowviewcontroller的back red vc按钮之后,就会跳回red view controller。编译一下,取保没有问题。运行程序。

    需要的说明:

    1.如果你像从yellowviewcontroller返回到redviewcontroller,那么unwind segue关联的方法必须要再redviewcontroller中写明,即此例子中的-(inaction)unwindtoredviewcontroller:(uistoryboardsegue *)segue;注意参数和返回指,方法名任意。

    2.是右键redviewcontroller的exit按钮(绿色按钮)出现unwind segue可以关联的方法,然后去关联yellowviewcontroller的button。


    同理,可以做BlueViewController返回到YellowViewController的实现。

    在YellowViewoController.m中

     

    - (IBAction)unwindToYellowViewController:(UIStoryboardSegue *)segue {

        

    }

    右键yellowviewcontroller的exit按钮,关联blueviewcontroler的back yellowvc 按钮。

    还需要实现从blueviewcontroller直接返回到redviewcontroller中,选中redviewcontroller的exit按钮,选择unwindtoredviewcontroller关联blueviewcontroller上的按钮。

    编译一下,没有任何问题,运行程序,感受一下。

    从YellowViewController和BlueViewController都可以返回到RedViewController,此时需要做一个判断,看看到底是从哪里返回的。

     

    1. - (IBAction)unwindSegueToRedViewController:(UIStoryboardSegue *)segue {  
    2.       
    3.     UIViewController *sourceViewController = segue.sourceViewController;  
    4.       
    5.     if ([sourceViewController isKindOfClass:[YellowViewController class]]) {  
    6.         NSLog(@"from yellow vc");  
    7.     }  
    8.     else if ([sourceViewController isKindOfClass:[BlueViewController class]]) {  
    9.         NSLog(@"from blue vc");  
    10.     }  
    11. }  


    这也是为什么方法的参数是segue的原因,通过segue可以拿到source view controller(源视图控制器)。

     

    尝试push之后,modal也是同样的道理,用modal模式从blueviewcontroller展示greenviewcontroller。

    要想返回,需要在blueviewcontroller中写关联unwind segue的方法:

     

    - (IBAction)unwindToBlueViewController:(UIStoryboardSegue *)segue {

        

    }

    关联unwindtoblueviewcontroller方法到相应的button上。

    至此,使用storyboard“返回”就告一段落了,大多数时间,花销在拖拽控件上,根本没有写相关pop dismiss方法。这也是storyboard的一大优势。

    是不是也可以用代码实现呢?可以的。

    在storyboard中选中GreenViewController scene,在左侧可以看到unwind segue的表示,有点像DNA序列是的,选中之后,定义它的唯一表示为greenUnwind

    在greenviewcontroller.m中

    back code按钮关联的方法:

     

    1. -(IBAction)backCodeBtnTapped:(id)sender {  
    2.   
    3.     [self performSegueWithIdentifier:@"greenUnwind" sender:self];  

    编译一下,没有任何错误,运程程序。


  • 相关阅读:
    DOS下读取4GB内存
    开始了
    PHP函数补完:var_export()
    php 调试相关
    css选择符
    javascript的urlencode
    用CSS代码绘制三角形 纯CSS绘制三角形的代码
    Jquery 操作Cookie
    提高PHP编程效率的53种方法
    执行phpinfo();时提示:date_default_timezone_set()
  • 原文地址:https://www.cnblogs.com/melons/p/5792019.html
Copyright © 2011-2022 走看看