当前位置: 首页 > news >正文

ios 监听一个控制器的属性_iOS控制器间跳转

iOS控制器间跳转一:UINavigationController为了便于管理控制器,iOS提供了2个比较特殊的控制器

UINavigationController

UITabBarController

简单实用

UIWindow显示根导航控制器,跳转到第一个控制器oneViewController

1

2

3

4

5

6

7

8

9

10

11

12

13UIWindow *window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];

self.window = window;

// 创建导航控制器

// 创建登陆控制器

AMLoginViewController *loginVc = [[AMLoginViewController alloc] initWithNibName:NSStringFromClass([AMLoginViewController class]) bundle:[NSBundle mainBundle]];

UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:loginVc];

window.rootViewController = nav;

[window makeKeyAndVisible];

由第一个控制器跳转到第二个控制器TwoViewController

1

2

3如果导航控制器调用 push,就会把 vc 添加为导航控制器的子控制器

TwoViewController *vc = [[TwoViewController alloc] init];

[self.navigationController pushViewController:vc animated:YES];

由第二个控制器跳转到第三个控制器ThreeViewController

1

2ThreeViewController *vc = [[ThreeViewController alloc] init];

[self.navigationController pushViewController:vc animated:YES];

由第三个控制器直接跳转到根控制器,或者返回上一个控制器

1

2

3

4

5// 返回到根控制器

[self.navigationController popToViewController:self.navigationController.childViewControllers[0] animated:YES];

// 返回到上一个控制器

[self.navigationController popViewControllerAnimated:YES];

只有栈顶控制器的界面才会显示出来,UINavigationController 有个属性是 topViewController 表示栈顶控制器

UINavigationController的子控制器管理UINavigationController以栈的形式保存子控制器

1

2@property(nonatomic,copy) NSArray *viewControllers;

@property(nonatomic,readonly) NSArray *childViewControllers;

使用push方法能将某个控制器压入栈

1- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated;

使用pop方法将栈顶的控制器移除

1- (UIViewController *)popViewControllerAnimated:(BOOL)animated;

回到指定的子控制器

1- (NSArray *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated;

回到根控制器(栈底控制器)

1- (NSArray *)popToRootViewControllerAnimated:(BOOL)animated;

注意:pop方法不是马上将栈顶子控制器拿出栈(销毁),而是在动画完成的时候才会销毁

控制器间跳转二:Modal

除了push之外,还有另一种控制器的切换方式,就是modal。任何控制器都可以通过modal形式展示出来

modal的默认效果:新的控制器从屏幕最底部往上钻,知道覆盖全部控制器位置。

以Modal的形式展示控制器代码如下:

1

2self presentViewController:(UIViewController *) animated:(BOOL) completion:^(void)completion

关闭当初Modal出来的控制器

1

2

3[self dismissViewControllerAnimated:(BOOL) completion:^{

code

}]

注意点Modal出来的控制器是直接添加到窗口上

Modal出来控制器后,虽然加到窗口上,但是窗口的跟控制器一直没被销毁

Modal出来的控制器需要被强引用,不然会被销毁,无法监听控制器事件

Modal出来的控制器被上一个控制器的presentedViewController属性强引用。

Modal的常见用法:Modal出导航控制器

Modal的dismiss原理:控制器被dismiss后,会被销毁

谁Modal也有权dismiss

被modal出来的控制器都可以dissmiss

导航控制器上的按钮modal,跳转到带导航控制器的控制器上。dismiss的时候会判断当前控制器有没有导航控制器,有也可以把导航控制器dismiss。

控制器之间的值传递

第一种方法可以用代理,不过比较麻烦,

这里推荐用 block 可以将要传递的值作为参数

在第一个控制器中拿到要跳转的控制器的 block 属性赋值,然后在跳转的控制器中执行 block 代码即可。

例子:将Vc1 控制器接收传值 ,Vc2控制器发送传值消息,为了便于区别和代理传值的 使用 , 将两者放到 一起其中Vc1控制器里 两个UITextField一个接收代理传值的使用,一个接收block 的使用 。

Vc1 :

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33#import "ViewController.h"

#import "SecondViewController.h"

@interface ViewController ()

- (IBAction)gengxin;

@property (weak, nonatomic) IBOutlet UITextField *textField;

@property (weak, nonatomic) IBOutlet UITextField *secTextField;

@property (nonatomic,strong) SecondViewController *secVc;

@end

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

// Do any additional setup after loading the view, typically from a nib.

SecondViewController *secondVc = [[SecondViewController alloc] init];

[secondVc returnText:^(NSString *showText) {

NSLog(@"---------%@------------",showText);

self.secTextField.text = showText;

}];

self.secVc = secondVc;

self.secVc.delegate = self;

}

- (IBAction)gengxin {

[self presentViewController:self.secVc animated:YES completion:nil];

}

#pragma mark - secondViewControllerDelegate

- (void)setTextfield:(NSString *)text{

self.textField.text = text;

NSLog(@"%@",text);

}

@end

1

2

3

4

5

6

7

8

9

10

11

12

13

14Vc2 :

#import "ViewController.h"

@protocol secondViewControllerDelegate

@optional - (void)setTextfield:(NSString *)text;

@end

typedef void(^returnBlock)(NSString *showText);

@interface SecondViewController : ViewController

@property (nonatomic,strong) id delegate;

//声明block 属性

@property (nonatomic,strong)returnBlock returnTextBlock;

//声明 调用方法

- (void) returnText: (returnBlock)block;

@end

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54#import "SecondViewController.h"

@interface SecondViewController ()

@property (nonatomic,weak) UITextField *textField;

@property (nonatomic,weak) UIButton *saveButton;

@end

@implementation SecondViewController

- (void)viewDidLoad {

[super viewDidLoad];

// Do any additional setup after loading the view.

self.view.backgroundColor = [UIColor grayColor];

UITextField *textField =[[UITextField alloc] init];

[self.view addSubview:textField];

[textField setBorderStyle:UITextBorderStyleRoundedRect];

self.textField = textField;

self.textField.frame = CGRectMake(100, 100, 100, 100);

UIButton *save = [[UIButton alloc] init];

[self.view addSubview:save];

self.saveButton = save;

self.saveButton.frame = CGRectMake(200, 200, 100, 70);

[self.saveButton setTitle:@"确定" forState:UIControlStateNormal];

self.saveButton.titleLabel.textColor = [UIColor blackColor];

[self.saveButton addTarget:self action:@selector(buttonClick:) forControlEvents:UIControlEventTouchUpInside];

}

- (void) buttonClick:(id)sender{

if ([self.delegate respondsToSelector:@selector(setTextField:)]) {

NSString *text =self.textField.text;

[self.delegate setTextfield:text];

}

[self dismissViewControllerAnimated:YES completion:nil];

}

- (void)didReceiveMemoryWarning {

[super didReceiveMemoryWarning];

// Dispose of any resources that can be recreated.

}

- (void) returnText:(returnBlock)block

{

self.returnTextBlock = block;

}

- (void)viewDidDisappear:(BOOL)animated

{

//即将消失的时候

if (self.returnTextBlock !=nil) {

self.returnTextBlock(self.textField.text);

}

NSLog(@"======%@=======",self.returnTextBlock);

}

@end

两者之间的理解方式相同 ,在Vc1传值的里面,将 returenText:方法里的 block值传入 Vc2 控制器里,在控制器 Vc2 跳转的时候,可以判断属性里有值,然后再重新加载 Vc1 的时候,就可以将值写入控制器里的 secTextField 里了

相关文章:

  • 语言中日期间的天数怎么计算_计算员工工龄,这个问题千万要注意
  • springboot过滤字段_springboot实现拦截器之验证登录示例
  • python计算机入门书籍_计算机学习--摘自python 入门书 侯爵
  • 如何卸载更换MySQL版本_mysql卸载(win10 适用于想更换版本的)
  • dos导入mysql文件_dos下导入mysql备份文件
  • java -jar 未响应_简单易学的测试攻略:JMeter测试Java请求示例
  • python 求余数_Python数据结构与算法——散列(Hash)
  • 此操作系统不支持 .net framework 4.6.2。_聊聊.net应用程序的Docker镜像
  • mysql binlog 实时_实时备份mysql binlog日志 脚本
  • oracle和mysql用户名_oracle 11g 默认用户名和密码
  • php mysql varchar_mysql中VARCHAR长度详细介绍
  • python图像读写技巧_Python图像读写方法对比
  • k8s一个容器多个镜像_AWS 容器三大新品:K8s 发行版,免费镜像库和 “Game Changer”AWS Proton...
  • c语言中的mecpy的用法_C语言的memcpy用法
  • python 判断字符串在数组中_一日一技:在 Golang 中如何快速判断字符串是否在一个数组中...
  • 【347天】每日项目总结系列085(2018.01.18)
  • 08.Android之View事件问题
  • create-react-app做的留言板
  • exports和module.exports
  • golang中接口赋值与方法集
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • Laravel核心解读--Facades
  • MySQL-事务管理(基础)
  • Python学习笔记 字符串拼接
  • V4L2视频输入框架概述
  • 程序员该如何有效的找工作?
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 前端工程化(Gulp、Webpack)-webpack
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 使用putty远程连接linux
  • 通过几道题目学习二叉搜索树
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 运行时添加log4j2的appender
  • !!java web学习笔记(一到五)
  • (13)Hive调优——动态分区导致的小文件问题
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (4.10~4.16)
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (附源码)ssm高校实验室 毕业设计 800008
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (一)Thymeleaf用法——Thymeleaf简介
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • .net 4.0发布后不能正常显示图片问题
  • .NET 8.0 中有哪些新的变化?
  • .NET Core WebAPI中封装Swagger配置
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?
  • .NET/C# 在 64 位进程中读取 32 位进程重定向后的注册表
  • .NET实现之(自动更新)
  • .NET序列化 serializable,反序列化
  • @Tag和@Operation标签失效问题。SpringDoc 2.2.0(OpenApi 3)和Spring Boot 3.1.1集成
  • @transaction 提交事务_【读源码】剖析TCCTransaction事务提交实现细节
  • [2019.3.5]BZOJ1934 [Shoi2007]Vote 善意的投票
  • [AI]文心一言爆火的同时,ChatGPT带来了这么多的开源项目你了解吗
  • [android]-如何在向服务器发送request时附加已保存的cookie数据
  • [AutoSar NVM] 存储架构