iOS对UIViewController生命周期和属性方法的解析(二)

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: iOS对UIViewController生命周期和属性方法的解析

四、UIViewController与StroyBoard的相关相互方法


       对于ViewConroller,我们一般有两种方式创建,一种是用纯代码的方式,一种是与StoryBoard关联,在UIViewController中,有许多方法方便我们与StoryBoard进行交互联系。


1、ViewController直接在StoryBoard中进行跳转的传值


       在StoryBoard中进行界面跳转是十分方便的,我们在StoryBoard中拉入两个ViewController,在一个上面添加一个按钮,点住按钮按住control,将鼠标拉到第二个controller上,会出现如下的跳转选项:


image.png


我们选择一个后,就会在两个controller之间建立一个跳转连接。当我们运行点击按钮后,会自动从第一个controller跳转到第二个controller。在UIViewController中有如下方法可以对是否跳转进行控制:


- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(nullable id)sender NS_AVAILABLE_IOS(6_0);

这个方法如果返回NO,自动跳转将不能进行,会被拒绝,需要注意的是,这个方法只会在自动的跳转时被调用,我们手动使用代码跳转StoryBoard中的连接关系时是不会被调用的,我们后面讨论。


       在执行过上述方法后,如果返回YES,系统还会在执行如下一个方法,作为跳转前的准备,我们可以在这个方法中进行一些传值操作,这个方法无论使我们手动进行跳转还是storyboard中自动跳转,都会被执行:


- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(nullable id)sender NS_AVAILABLE_IOS(5_0);

sugur对象中封装了相关的ViewController,可以使用segue.destinationViewController获取。


       segue在StoryBoard中除了用来自动正向跳转外,我们还可以进行反向的跳转,类似pop和dismiss方法,这种segue被称为unwind sugue。例如,我们有一个controller1和一个controllert2,要使用unwind segue从2返回1,我们需要在2中实现如下格式的方法:


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

   NSLog(@"unwindSegueToViewController");

}

这个方法中的返回值必须为IBAction,参数必须是UIStoryboardSegue,方法名我们可以自己定义,之后在StoryBoard中的ViewController1中的Exit选项中,我们会发现多了一个这样的方法:


image.png


我们可以把它连接到viewController2中的一个按钮上:


image.png


这样,当我们点击viewController2中的按钮时,就会返回到我们第一个ViewController1中了。


当然,在使用unwind segue方法时,也是会有一些回调帮助我们进行跳转前的设置和传值,UIViewController如下方法会在跳转前调用,返回NO,则不能进行跳转:


-(BOOL)canPerformUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender{

   NSLog(@"canPerformUnwindSegueAction");

   return YES;

}

之后会执行我们自定义的unwindSegue方法,这个方法中我们可以什么都不写,模式是会进行跳转的。


2、使用代码跳转Storyboard中的controller


       我们除了在Storyboard中拉拉扯扯可以进行控制器的跳转外,我们也可以使用代码来跳转Storyboard中segue连接关系。


       在Storyboard中两个控制器间建立一个segue联系,我们可以取一个名字:


image.png


在触发跳转的方法中,使用如下方法进行跳转,这里面的参数id就是我们取得segue的id:


- (void)performSegueWithIdentifier:(NSString *)identifier sender:(nullable id)sender NS_AVAILABLE_IOS(5_0);

下面三个属性我们可以获取controller的nib文件名,其storyBoard和其Bundle:


@property(nullable, nonatomic, readonly, copy) NSString *nibName;  

@property(nullable, nonatomic, readonly, strong) NSBundle *nibBundle;

@property(nullable, nonatomic, readonly, strong) UIStoryboard *storyboard NS_AVAILABLE_IOS(5_0);

五、UIViewController之间的一些从属关系


       这部分的内容和方法可能我们接触用到的并不多,但是在某些情况下,使用这些方法可以大大的方便某些逻辑。


1、parentViewController


       UIViewController里面封装了一个数组,可以存放其子ViewController,系统中使用的例子就是导航和tabBar这类的控制器,我们使用如下方法可以直接访问这些父的controller:


@property(nullable,nonatomic,weak,readonly) UIViewController *parentViewController;

2、模态跳转中Controller的从属


       在我们进行控制器的跳转时,只要控制器没有被释放,我们都可以顺藤摸瓜的找到它,使用如下两个方法:


//其所present的contller,比如,A和B两个controller,A跳转到B,那么A的presentedViewController就是B

@property(nullable, nonatomic,readonly) UIViewController *presentedViewController  NS_AVAILABLE_IOS(5_0);

//和上面的方法刚好相反,比如,A和B两个controller,A跳转到B,那么B的presentingViewController就是A

@property(nullable, nonatomic,readonly) UIViewController *presentingViewController NS_AVAILABLE_IOS(5_0);

了解了上面方法我们可以知道,对于反向传值这样的问题,我们根本不需要代理,block,通知等这样的复杂手段,只需要获取跳转到它的Controller,直接设置即可。举个例子,我们需要在第二个界面消失后,改变第一个界面的颜色,在第二个controller中只需要下面的代码即可实现 :


   self.presentingViewController.view.backgroundColor = [UIColor colorWithRed:arc4random()%255/255.0 green:arc4random()%255/255.0 blue:arc4random()%255/255.0 alpha:1];

   [self dismissViewControllerAnimated:YES completion:nil];

六、UIViewController的模态跳转及动画特效


       单纯的UIViewController中,我们使用最多的是如下的两个方法,一个向前跳转,一个向后返回:


- (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^ __nullable)(void))completion NS_AVAILABLE_IOS(5_0);

- (void)dismissViewControllerAnimated: (BOOL)flag completion: (void (^ __nullable)(void))completion NS_AVAILABLE_IOS(5_0);

从方法中,我们可以看到,有animated这个参数,来选择是否有动画特效,默认的动画特效是像抽屉一样从手机屏幕的下方向上弹起,当然,这个效果我们可以进行设置,UIViewController有如下一个属性来设置动画特效:


@property(nonatomic,assign) UIModalTransitionStyle modalTransitionStyle NS_AVAILABLE_IOS(3_0);

注意,这个要设置的是将要跳转到的controller,枚举如下:


typedef NS_ENUM(NSInteger, UIModalTransitionStyle) {

   UIModalTransitionStyleCoverVertical = 0,//默认的,从下向上覆盖

   UIModalTransitionStyleFlipHorizontal ,//水平翻转

   UIModalTransitionStyleCrossDissolve,//溶解

   UIModalTransitionStylePartialCurl ,从下向上翻页

};

除了跳转的效果,还有一个属性可以设置弹出的controler的填充效果,但是这个属性只在pad上有效,在iphone上无效,都是填充到整个屏幕:


@property(nonatomic,assign) UIModalPresentationStyle modalPresentationStyle NS_AVAILABLE_IOS(3_2);

//枚举如下

typedef NS_ENUM(NSInteger, UIModalPresentationStyle) {

       UIModalPresentationFullScreen = 0,//填充整个屏幕

       UIModalPresentationPageSheet,//留下状态栏

       UIModalPresentationFormSheet,//四周留下变暗的空白

       UIModalPresentationCurrentContext ,//和跳转到它的控制器保持一致

       UIModalPresentationCustom NS_ENUM_AVAILABLE_IOS(7_0),//自定义

       UIModalPresentationOverFullScreen NS_ENUM_AVAILABLE_IOS(8_0),

       UIModalPresentationOverCurrentContext NS_ENUM_AVAILABLE_IOS(8_0),

       UIModalPresentationPopover NS_ENUM_AVAILABLE_IOS(8_0) __TVOS_PROHIBITED,

       UIModalPresentationNone NS_ENUM_AVAILABLE_IOS(7_0) = -1,        

};

目录
相关文章
|
5天前
|
人工智能
歌词结构的巧妙安排:写歌词的方法与技巧解析,妙笔生词AI智能写歌词软件
歌词创作是一门艺术,关键在于巧妙的结构安排。开头需迅速吸引听众,主体部分要坚实且富有逻辑,结尾则应留下深刻印象。《妙笔生词智能写歌词软件》提供多种 AI 功能,帮助创作者找到灵感,优化歌词结构,写出打动人心的作品。
|
12天前
|
存储 算法 Java
解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用
在Java中,Set接口以其独特的“无重复”特性脱颖而出。本文通过解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用。
30 3
|
13天前
|
缓存 JavaScript 前端开发
Vue3与Vue2生命周期对比:新特性解析与差异探讨
Vue3与Vue2生命周期对比:新特性解析与差异探讨
62 2
|
6天前
|
人工智能
写歌词的技巧和方法全解析:开启你的音乐创作之旅,妙笔生词智能写歌词软件
怀揣音乐梦想,渴望用歌词抒发情感?掌握关键技巧,你也能踏上创作之旅。灵感来自生活点滴,主题明确,语言简洁,韵律和谐。借助“妙笔生词智能写歌词软件”,AI辅助创作,轻松写出动人歌词,实现音乐梦想。
|
5天前
|
JavaScript 前端开发 开发者
理解Vue实例:生命周期钩子全面解析
【10月更文挑战第21天】理解Vue实例:生命周期钩子全面解析
12 4
|
6天前
|
安全 Java
Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧
【10月更文挑战第20天】Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧,包括避免在循环外调用wait()、优先使用notifyAll()、确保线程安全及处理InterruptedException等,帮助读者更好地掌握这些方法的应用。
8 1
|
13天前
|
存储 JavaScript 前端开发
Vue3权限控制全攻略:路由与组件层面的用户角色与权限管理方法深度解析
Vue3权限控制全攻略:路由与组件层面的用户角色与权限管理方法深度解析
55 2
|
12天前
|
SQL 监控 数据库
SQL语句是否都需要解析及其相关技巧和方法
在数据库管理中,SQL(结构化查询语言)语句的使用无处不在,它们负责数据的查询、插入、更新和删除等操作
|
1天前
|
安全 5G Android开发
安卓与iOS的较量:技术深度解析
【10月更文挑战第24天】 在移动操作系统领域,安卓和iOS无疑是两大巨头。本文将深入探讨这两个系统的技术特点、优势和不足,以及它们在未来可能的发展方向。我们将通过对比分析,帮助读者更好地理解这两个系统的本质和内涵,从而引发对移动操作系统未来发展的深思。
5 0
|
12天前
|
SQL 数据可视化 BI
SQL语句及查询结果解析:技巧与方法
在数据库管理和数据分析中,SQL语句扮演着至关重要的角色

推荐镜像

更多