在UIKit中,每个控制器管理着App中的一个页面,多页面的管理方式包括以下几种:
创新互联是一家集网站建设,江汉企业网站建设,江汉品牌网站建设,网站定制,江汉网站建设报价,网络营销,网络优化,江汉网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。1)使用模态方式切换页面
2)使用导航控制器管理多个页面
3)使用标签控制器管理多个页面
modal,即模态方式,目的控制器被覆盖着源控制器,并接受用户的交互
默认的动作是:从屏幕的下方弹出
下面介绍modal切换方式实现的三种方式以及页面之间数据的传递
代理切换
storyboard的自动型segue
storyboard的自动型segue
代码实现控制器的modal切换
切换动作中涉及的两个控制器
源控制器:执行切换动作的控制器
目的控制器:被切换并显示的控制器
源控制器使用以下方法切换目的控制器:
- (void)presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion
viewControllerToPresent参数:目的控制器
flag参数:动画使能
completion参数:切换动作完成时执行的代码
注意:该方法调用时,源控制器必须已经显示,不要在viewDidLoad方法中调用
源控制器和目的控制器使用以下方法完成页面返回的功能:
- (void)dismissViewControllerAnimated:(BOOL)flag completion:(void (^)(void))completion
如果是目的控制器调用,会自动交给源控制器去执行返回动作,即源控制器和目的控制器都可以执行,且效果一样。
代码切换:示例1
切换到UIAlertViewController
UIAlertController * ac = [UIAlertController alertControllerWithTitle:@"版本更新?" message:@"检测到新版本,是否到App Store更新?" preferredStyle:UIAlertControllerStyleAlert]; UIAlertAction * a1 = [UIAlertAction actionWithTitle:@"更新" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { [[UIApplication sharedApplication] openURL:updateURL]; }]; UIAlertAction * a2 = [UIAlertAction actionWithTitle:@"算了" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) { }]; [ac addAction:a1]; [ac addAction:a2]; [self presentViewController:ac animated:YES completion:^{ NSLog(@"modal"); }];
UIAlertController是UIKit中的控制器,并必须使用modal方式显示
UIAlertController内部已经实现了点击按钮执行dismissViewController...方法
UIAlertController用于代替UIAlertView及UIActionSheet
代码切换:示例2
切换到自定义的控制器
//源控制器:执行器执行切换动作 AMViewContoller * vc = [[UIViewController alloc] init]; [self presentViewController:vc animated:YES completion:^{ NSLog(@"modal"); }];
//目的控制器:执行返回动作 [self dismissViewControllerAnimated:YES completion:^{ NSLog(@"返回"); }];
代码切换:控制器间值的传递
正向传递:源控制器将数据传递到目的控制器
传递时机:目的控制器被创建后,目的控制器显示前
传递方法:
目的控制器添加属性
切换前,为目的控制器的属性赋值
//目的控制器 @interface AMViewControllerTwo:UIViewController @property (nonatomic, copy) NSString * str; @end @implementation AMViewControllerTwo - (void) viewDidLoad { [super viewDidLoad]; NSLog(@"源控制器:%@", self.str); } @end
//源控制器的切换动作 AMViewControllerTwo * vc = [[AMViewControllerTwo alloc] init]; vc.str = @"这是源控制器AMViewControllerOne给你的数据"; [self presentViewController:vc animated:YES completion:^{ NSLog(@"modal"); }];
逆向传递:目的控制器将数据传递到源控制器
传递时机:目的控制器返回前
传递方法:
目的控制器添加代理属性并提出代理协议
源控制器成为目的控制器的代理并实现代理方法
dismiss前,调用代理的代理方法并间数据作为方法的参数传递
//目的控制器 @class AMViewControllerTwo; @protocol AMViewControllerTwoDelegate : NSObject - (void) viewControllerTwo:(AMViewControllerTwo*) vc dismissWithStr:(NSString *) str; @end @interface AMViewControllerTwo @property (nonatomic, copy) NSString * str; @property (nonatomic, weak) iddelegate; @end
//目的控制器执行dimiss动作 if ( self.delegate && [self.delegate respondsToSelector:@selector(viewControllerTwo:dismissWithStr:)] ) { [self.delegate viewControllerTwo:self dismissWithStr:@"这是目的控制器AMViewControllerOnew还你的数据"]; } [self dismissViewControllerAnimated:YES completion:^{ NSLog(@"返回"); }];
//源控制器遵循代理协议 @interface AMViewControllerOne : UIViewController@end
//源控制器实现代理方法 - (void) viewControllerTwo:(AMViewControllerTwo*) vc dismissWithStr:(NSString *) str { NSLog(@"目的控制器:%@", ); }
//源控制器的切换动作 AMViewControllerTwo * vc = [[AMViewControllerTwo alloc] init]; vc.str = @"这是源控制器AMViewControllerOne给你的数据"; vc.delegate = self; [self presentViewController:vc animated:YES completion:^{ NSLog(@"modal"); }];
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
当前标题:UIKit框架(9)控制器的modal切换方式(一)-创新互联
标题来源:http://lswzjz.com/article/cejsgo.html