iOS:视图切换的第一种方式:模态视图

一、UIModalController:模态窗口(一个控制器模态出另一个控制器的模态窗口)

  当我们在view controller A中模态显示view controller B的时候,A就充当presenting view controller(弹出VC),而B就是presented view controller(被弹出VC)。官方文档建议这两者之间通过delegate实现交互,在被弹出的VC中定义delegate,然后在弹出VC中实现该代理,这样就可以比较方便的实现两者之间的交互。

1、以模态窗口的形式管理视图,当前视图关闭前其他视图上的内容无法操作。

2、获取不同的模态窗口(主要的属性)

@property(nonatomic,readonly) UIViewController *presentedViewController ;//当前控制器模态出的窗口.

@property(nonatomic,readonly) UIViewController *presentingViewController;//模态出当前控制器的窗口

3、处理模态窗口(主要的方法)

- (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^)(void))completion);//显示想要显示的模态窗口

- (void)dismissViewControllerAnimated: (BOOL)flag completion: (void (^)(void))completion);//关闭当前显示的模态窗口

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id) //当前控制器模态另一个窗口并传输数据时调用的方法

4、用模态窗口的方式实现视图的切换,即可以在stroybord中通过modal连接的方式将几个UIController连接后去通过按钮事件实现切换,也可以纯代码将storyboard中的几个UIController连接后通过按钮事件实现切换。

  举例:两个视图切换(FirstViewController、SecondViewController),模态窗口,并输出数据

类关联:

   

 SecondViewController           FirstViewController

  当在storyboard中直接通过modal方式将控制器连接后,需要将storyboard中Segue的属性identifier设置为modal,以便于当前控制器模态出另一个控制器的模态窗口和传输数据。

  第一步:拖出两个视图控制器到storyboard中,并已modal方式连接

  

 第二步:设置storyboard中的segue的属性identifier标识符

 第三步:在FirstViewController控制器中模态出窗口并只进行正向传输数据 

 第四步:在SecondViewController中关闭被模态窗口,并接受数据  

  

  当storyboard中的控制器没有通过modal方式直接连接时,可以通过代码来连接,需要将storyboard中要被模态出窗口的控制器的identify的storyboardID设置一个标识。然后,首先创建要被模态显示的控制器,即根据storyboard对象根据标识来加载要被模态窗口的控制器,最后进行模态窗口和传输数据。用这种方式传输数据时,如果是两个以上的控制实现视图切换,由于控制器耦合性太强,会出现错错误,不建议使用。而是通过设置代理来实现数据的传输,即在被模态窗口的控制器中设置协议和代理,在模态窗口的控制器中实现代理的方法即可,大大降低了控制器中间的耦合性。

  《1》切换视图,并不通过代理实现数据正向和反向传输

第一步:拖出两个视图控制器到storyboard中,未连接

第二步:将storyboard中要被模态出窗口的控制器SecondViewController的identify的storyboardID设置一个标识

第三步:在FirstViewController控制器中模态出窗口,并正向传递数据

 1 #import "ViewController.h"
 2 #import "SecondViewController.h"
 3 @interface ViewController ()
 4 @property (weak, nonatomic) IBOutlet UITextField *TextField;
 5
 6 @end
 7
 8 @implementation ViewController
 9 -(void)setTextWithBackInfo:(NSString *)info
10 {
11     self.TextField.text = info;
12 }
13 - (void)viewDidLoad {
14     [super viewDidLoad];
15 }
16 //纯代码创建模态显示
17 - (IBAction)forwardClicked:(UIButton *)sender
18 {
19     //首先创建模态显示的控制器
20     //从storyboard中加载控制器
21     UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
22
23     //匹配storyboard的标识符
24     SecondViewController *secondVC = [storyboard instantiateViewControllerWithIdentifier:@"Second"];
25
26     //正向传数据
27     secondVC.info = self.TextField.text;
28
29     //显示模态窗口
30     [self presentViewController:secondVC animated:YES completion:nil];
31 }
32
33 @end

第四步:在SecondViewController中关闭被模态出的窗口,并反向传输数据

    

        《2》切换视图,通过代理实现数据正向和反向传输

  主要代码如下:

  FirstViewController控制器中的代码:

1 #import <UIKit/UIKit.h>
2
3 @interface ViewController : UIViewController
4
5 -(void)setTextWithBackInfo:(NSString *)info;
6 @end
 1 #import "ViewController.h"
 2 #import "SecondViewController.h"
 3 @interface ViewController ()<SecondViewControllerDelegate>
 4 @property (weak, nonatomic) IBOutlet UITextField *TextField;
 5
 6 @end
 7
 8 @implementation ViewController
 9 -(void)setTextWithBackInfo:(NSString *)info
10 {
11     self.TextField.text = info;
12 }
13 - (void)viewDidLoad {
14     [super viewDidLoad];
15 }
16 //纯代码创建模态显示
17 - (IBAction)forwardClicked:(UIButton *)sender
18 {
19     //首先创建模态显示的控制器
20     //从storyboard中加载控制器
21     UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
22
23     //匹配storyboard的标识符
24     SecondViewController *secondVC = [storyboard instantiateViewControllerWithIdentifier:@"Second"];
25
26     //正向传数据
27     secondVC.info = self.TextField.text;
28
29     //为了接受反向数据,将自己设置为模态窗口的代理,很好的降低了模态窗口的耦合性
30     secondVC.delegate = self;
31
32     //显示模态窗口
33     [self presentViewController:secondVC animated:YES completion:nil];
34 }
35
36 #pragma mark -SecondViewController的代理方法
37 //通过代理接受模态窗口反向传回的数据
38 -(void)SecondVC:(SecondViewController *)vc didFinishedWithInfo:(NSString *)info
39 {
40     self.TextField.text = info;
41 }
42 @end

    SecondViewController控制器中的代码:

 1 #import <UIKit/UIKit.h>
 2 @protocol SecondViewControllerDelegate;
 3 @interface SecondViewController : UIViewController
 4 @property (weak, nonatomic) IBOutlet UILabel *label;
 5 @property (copy,nonatomic)NSString *info;
 6 //2.添加代理属性
 7 @property (weak,nonatomic)id<SecondViewControllerDelegate> delegate;
 8 @end
 9
10
11 //1.定义协议
12 @protocol SecondViewControllerDelegate
13
14 -(void)SecondVC:(SecondViewController*)vc didFinishedWithInfo:(NSString*)info;
15
16 @end
 1 #import "SecondViewController.h"
 2
 3 @interface SecondViewController ()
 4 @property (weak, nonatomic) IBOutlet UITextField *textField;
 5 @end
 6
 7 @implementation SecondViewController
 8 - (IBAction)backButtonClicked:(UIButton *)sender
 9 {
10     //self.presentedViewController  当前控制器模态出的窗口
11     //self.presentingViewController 模态出当前控制器的窗口
12
13
14     //3.通过代理反向传数据
15     [self.delegate SecondVC:self didFinishedWithInfo:self.textField.text];
16
17
18     //关闭模态窗口
19     [self.presentingViewController dismissViewControllerAnimated:YES completion:nil];
20
21 }
22
23 - (void)viewDidLoad {
24     [super viewDidLoad];
25     // Do any additional setup after loading the view.
26
27     self.label.text = self.info;
28 }

    最后的演示结果为:

 

 

时间: 2024-10-12 03:40:35

iOS:视图切换的第一种方式:模态视图的相关文章

iOS多线程编程的几种方式

一.线程概述 有些程序是一条直线,起点到终点——如简单的hello world,运行打印完,它的生命周期便结束了,像昙花一现. 有些程序是一个圆,知道循环将它切断——像操作系统,一直运行,直到你关机. 一个运行着的程序就是一个进程或者叫做一个任务,一个进程至少包含一个线程,线程就是程序的执行流. Mac和IOS中的程序启动,创建好一个进程的同时,一个线程便开始运作,这个线程叫做主线程.主线程在程序中的位置和其他线程不同,它是其他线程最终的父线程,且所有的界面的显示操作即AppKit或UIKit的

Unity 人物跟谁手指的移动(第一种方式)

长夜漫漫无心睡眠,敲敲代码,越敲越来劲! 我发现好多小朋友都在玩熊出没之xxxx这个游戏,居然打了一下午都没玩通第2关,我把测试也叫来陪我一起玩! 结果他也打不通,我再去叫策划,他也没打过,我去叫主管,他还是没打过,我再回去叫测试使用游戏修改大师,修改宝石买完全部的装备!结果他还是没打过! (这款游戏,让我人生都变得没有了意义!) 人物跟随手指的移动而移动: 第一种方式: 手指移动了多少,主角就移动多少!(我使用的这种方式,存在问题,手指过快滑动,主角会慢慢跟手指有了距离!) 第二种方式: 手指

react做tab切换的几种方式

最近搞一个pc端的活动,搞了一个多月,甚烦,因为相比于pc端,更喜欢移动端多一点.因为移动端又能搞我的react了. 今天主要总结一下react当中tab切换的几种方式,因为tab切换基本上都会用到.当然,你也可以在react当中用jquery或者zepto来实现,不过既然都用react了,能不能用jq,就尽量不用jq.不过不得不吐槽一下,在jquery很简单的东西,在react中稍微复杂化了一点. 目前我用到的tab切换只有两种方式,所以暂时总结这两种,以后有遇到其他的再总结. 第一种.只是子

【百度地图API】关于如何进行城市切换的三种方式

原文:[百度地图API]关于如何进行城市切换的三种方式 摘要:本文介绍了三种切换城市的方式:查询城市.城市列表和显示城市轮廓. --------------------------------------------------------------------- 很多API爱好者问到我,如何像百度地图那样,实现各个城市之间的切换呢? 在这里,公布以下三种方式. 第一种,是查询城市的方法.使用API接口的LocalSearch方法.我之前写过完整的文章,请查看: http://www.cnbl

iOS代码加密的几种方式

众所周知的是大部分iOS代码一般不会做加密加固,因为iOS APP一般是通过AppStore发布的,而且苹果的系统难以攻破,所以在iOS里做代码加固一般是一件出力不讨好的事情.万事皆有例外,不管iOS.adr还是js,加密的目的是为了代码的安全性,虽然现在开源畅行,但是不管个人开发者还是大厂皆有保护代码安全的需求,所以iOS代码加固有了生存的土壤.下面简单介绍下iOS代码加密的几种方式. iOS代码加密的几种方式 1.字符串加密 字符串会暴露APP的很多关键信息,攻击者可以根据从界面获取的字符串

iOS数据存储的几种方式

iOS的数据存储是iOS应用开发的重要知识点: 关于这方面知识,网上有很多介绍,但对于代码层次的使用方式并未有系统全面介绍.此文章针对iOS稍熟悉的童鞋,需要对CoreData的原理有一定的了解.目前存储方式大概有以下几种: NSKeyedArchiver  适用简单数据加密 NSUserDefaults  适用配置参数 Write  文件操作,同NSKeyedArchiver SQLite3  操作较复杂,不建议使用. CoreData  取代SQLite3,但要遵循NSManagedObje

UserView--第二种方式(避免第一种方式Set饱和),基于Spark算子的java代码实现

UserView--第二种方式(避免第一种方式Set饱和),基于Spark算子的java代码实现 测试数据 java代码 1 package com.hzf.spark.study; 2 3 import java.util.Map; 4 import java.util.Set; 5 6 import org.apache.spark.SparkConf; 7 import org.apache.spark.api.java.JavaPairRDD; 8 import org.apache.s

iOS:延时执行的三种方式

延时执行的三种方式:performSelectorXXX方法.GCD中延时函数.创建定时器 第一种方式:NSObject分类当中的方法,延迟一段时间调用某一个方法 @interface NSObject (NSDelayedPerforming) ※延时调用在当前线程使用特定模式的方法(如果数组没有数据或者参数为nil,则不会调用selector中方法) - (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterD

iOS 拨打电话的两种方式

第一种方式 NSString *phone = @"88888888" if (phone != nil) { NSString *telUrl = [NSString stringWithFormat:@"telprompt:%@",phone]; NSURL *url = [[NSURL alloc] initWithString:telUrl]; [[UIApplication sharedApplication] openURL:url]; } 第二种方式