iOS多界面传值

news2024/11/14 2:34:48

iOS多界面传值

文章目录

  • iOS多界面传值
    • 属性传值
    • 协议传值
    • Block传值
    • 通知传值
    • KVO传值
      • 概述
      • 使用步骤
    • 总结

属性传值

这个传值方式和他的名字一样,我们主要还是通过属性对值进行一个传递,主要应用场景是前一个页面向后一个页面传值

首先我们先要设置一个属性

@interface secondViewController : UIViewController
@property (nonatomic, assign) NSInteger tag; //tag就是我们设置的一个属性
@end

其次我们需要在某一个地方触发传值的事件,然后通过事件进行一个传递,这里我设置一个button来触发传值事件

-(void)press {
    secondViewController* second = [[secondViewController alloc] init];
    second.tag = _num;
    [self.navigationController pushViewController:second animated:YES];
}

然后我们这新的页面就拿到了这个数值,可以对然后就可以对这个数值进行一个相应的处理了

- (void)viewDidLoad {
    ····
    self.label.text = [NSString stringWithFormat:@"%ld", _tag];
    NSLog(@"%ld", _tag);
    ····
    
    // Do any additional setup after loading the view.
}

属性传值比较简单,就是这些内容,重点是前一个页面通过属性向后一个页面传值。

协议传值

协议传值是通过代理来实现的,主要的应用场景是一个后一个页面向前一个页面传值。

第一步

首先设置一个协议,注意是在后一个页面设置这个协议

@protocol VCFourthDelegte <NSObject>
-(void)ChangeImageView:(NSInteger)tag;
@end

第二步

在后面这个页面设置属性用作代理

@property (nonatomic, weak) id<VCFifthDelegate> delegate; //这里尽量采用weak作为修饰符

第三步

在某一个位置触发代理事件,将需要传递的数据向前传递。

[self.delegate changeImageView:tap.view.tag];
[self.navigationController popViewControllerAnimated:YES];

第四步

在前一个视图控制器中间遵循协议并实现代理方法,以接收传递过来的数据。

- (void)changeImageView:(NSInteger)tag {
    self.tag = tag;
    [self.tableView reloadData];
}

第五步

不要忘了在前一个视图控制器推出下一个视图控制器的时候将后者的代理设置成自己

 ViewController5* vc5 = [[ViewController5 alloc] init];
 vc5.delegate = self;
 [self.navigationController pushViewController:vc5 animated:YES];

我们主要是要将后面的视图控制器作为前一个视图控制器的代理,让后者为前者完成一些底层的内容从而改变前者的内容。

Block传值

block传值同样用于后一个页面向前一个页面传值。

第一步

在后一个页面中定义一个Block属性

@property (nonatomic, copy) void(^reutnblock)(NSString* temp, NSInteger num);

第二步

设置一个事件来触发返回上一级视图控制器的时候,使用第一步定义的Block,把需要传递的值放在^Block中间

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor whiteColor];
    self.label = [[UILabel alloc] initWithFrame:CGRectMake(100, 100, 100, 40)];
    self.label.textColor = [UIColor whiteColor];
    self.label.text = @"123412342";
    NSLog(@"%ld", _tag);
    _btn1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];\
    self.btn1.frame = CGRectMake(100, 100, 100, 100);
    self.view.backgroundColor = [UIColor whiteColor];
    self.btn1.backgroundColor = [UIColor redColor];
    [self.btn1 setTitle:@"state" forState:UIControlStateNormal];
    [self.view addSubview:self.btn1];
    [self.btn1 addTarget:self action:@selector(press) forControlEvents:UIControlEventTouchUpInside];
    self.label.backgroundColor = UIColor.redColor;
    [self.view addSubview:_label];
    
    // Do any additional setup after loading the view.
}
-(void)press{
    self.reutnblock(self.label.text, --_tag); // 重点部分
    [self.navigationController popViewControllerAnimated:YES];
    
}

第三步

在前一个页面跳转到后一个页面的事件函数中,调用后一个页面中的Block这个属性

-(void)press {
    secondViewController* second = [[secondViewController alloc] init];
    second.reutnblock = ^(NSString * _Nonnull temp, NSInteger num) {
        self.label.text = temp;
        self.num = num;
    };
    [self.navigationController pushViewController:second animated:YES];
}

下面给出一个通过Block实现的一个效果图,这里我们通过这段代码将后一个页面的label中的文字传到了前一个视图控制器中,从而实现了一个从后向前传值的一个效果。

请添加图片描述

通知传值

通知传值主要是通过一个通知中心进行传值,可以跨域多个页面进行一个传值。我在实现一个深色模式的时候采用了这种传值方式,通过一个通知中心将一个全局变量传给其他几个页面,一般也是从后面的页面传给前面的页面。

第一个步骤

创建并且发送通知

[[NSNotificationCenter defaultCenter] postNotificationName:@"notice" object:nil userInfo:@{@"first":@"123"}];

现在介绍一下这个方法的几个参数:
NSNotificationCenter: NSNotificationCenter 是一个单例对象,用于在应用程序内传递消息。它允许一个对象发布通知,其他对象可以注册为该通知的观察者,以便在通知发布时收到消息。
defaultCenter: 这是 NSNotificationCenter 的类方法,返回应用程序的默认通知中心实例。
postNotificationName:object:userInfo:: 这是 NSNotificationCenter 的实例方法,用于发布通知。
postNotificationName: 要发布的通知的名称。在这里,通知的名称是 “notice”。
object: 通知的发送者,可以是任何对象。这里传入 nil,表示没有特定的发送者。
userInfo: 一个字典,包含通知的附加信息。在这里,字典包含一个键值对 @“first”: @“123”。

第二个步骤

注册一个观察者

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receive:) name:@"notice" object:nil];

介绍一下这个函数的内容

第三个步骤

接收者对象需要实现一个方法,用于处理接收到的通知。这个方法是在观察者注册时通过selector参数指定的。当通知被发送时,通知中心会调用这个方法,并传递相关的信息给观察者。

-(void)receive:(NSNotification*) send {
    NSLog(@"接受通知");
    NSLog(@"%@", send.userInfo[@"first"]);
    self.label.text = send.userInfo[@"first"];
}

第四个步骤

在接收者对象被销毁之前,需要将其从通知中心中移除,避免出现潜在的内存泄漏。可以使用NSNotificationCenter的removeObserver:系列方法来移除观察者。

-(void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

下面就是相关的一个实现效果,我将字符串123传递到前一个Label中,成功实现了一个通知传值

请添加图片描述

KVO传值

概述

KVO全称KeyValueObserve也就是观察者模式,是apple提供的一套事件通知机制.允许对象监听另一个对应特殊属性的改变,并在改变时接受到该事件.一般继承自NSObject的对象都默认是支持KVO。

KVO(Key-Value-Observing,键值观察),即观察关键字的值的变化。首先在子页面中声明一个待观察的属性,在返回主页面之前修改该属性的值。在主页面中提前分配并初始化子页面,并且注册对子页面中对应属性的观察者。在从子页面返回主页面之前,通过修改观察者属性的值,在主页面中就能自动检测到这个改变,从而读取子页面的数据。KVO只对属性发生作用。

传递方向

主要也是从后往前。

这里我们主要演示的是一个从A页面通过KVO来监听B页面的一个值,下面来看具体的实现流程。

使用步骤

第一步

注册观察者

同样和上面的通知传值一样,在触发事件的函数中注册我们的观察者。

@property (nonatomic, strong) secondViewController* second; //这里现在第一个页面中设置第二个页面作为自己的一个属性
- (void)press { //这里我才用了一个按钮来触发事件
    //[self willChangeValueForKey:@"ary"];
    self.second = [[secondViewController alloc] init];
    [self.second addObserver:self forKeyPath:@"userName" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];
    [self.navigationController pushViewController:self.second animated:YES];
}

这里解释一下这几个参数的含义:

P1: 观察者,该对象必须实现 该对象必须实现 observeValueForKeyPath:ofObject:change:context: 方法。
P2:要观察的属性。
P3:选择监听返回的值的类型:enum {
NSKeyValueObservingOptionNew 接收方法中使用change参数传入变化后的新值
NSKeyValueObservingOptionOld 接收方法中使用change参数传入变化前的旧值
NSKeyValueObservingOptionInitial change参数内容会包含新值
NSKeyValueObservingOptionPrior 如果加入这个参数,接收方法会在变化前后分别调用一次,共两次,变化前的通知change参数
};

P4: 传入任意类型的对象,在接受消息回调的代码中可以接受这个对象

第二步

接受通知,使用方法observeValueForKeyPath:ofObject:change:context:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context {
    if ([keyPath isEqualToString:@"userName"]) {
        self.label.text = self.second.userName;
        NSLog(@"old text:%@   new text:%@", [change objectForKey:NSKeyValueChangeOldKey], [change objectForKey:NSKeyValueChangeNewKey]);
    }
}

第三步

删除KVO

- (void)dealloc {
    [self removeObserver:self forKeyPath:@"userName"];
}

这样就可以实现我们的KVO传值的效果,这里就可以看到我们在的子页面修改值后,主页面的UILabel出现了一个改变,这样我们就实现了一个传值。

请添加图片描述

tips

  • 这种方式不可以实现对于数组元素的一个监听,因为KVO是对于setter方法的监听,而数组的addObject方法并不是setter方法的内容,所以无法通过上述方法实现对于数组的一个监听。
  • 不使用时要移除KVO。

总结

iOS多界面传值主要就是通过这五种方式来实现,笔者这里只是简单学习了如何使用这几种传值方式的用法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1976631.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

哪里有ai写真软件免费方法?轻松获取写真的5个技巧

想在8月为自己的社交媒体更新个人形象吗&#xff1f;想要为即将到来的秋季增添一抹新意吗&#xff1f; AI写真软件是我们最佳的理想选择&#xff0c;通过简单的操作&#xff0c;我们可以在短时间内获得一张专属于自己的AI头像&#xff0c;让这个夏天的回忆更加生动。 特别是常…

C++进阶:设计模式___适配器模式

前言 在C的基础语法的学习后,更进一步为应用场景多写代码.其中设计模式是有较大应用空间. 引入 原本在写容器中适配器类有关的帖子,发现适配模式需要先了解,于是试着先写篇和适配器模式相关的帖子 理解什么是适配器类,需要知道什么是适配器模式.适配器模式是设计模式的一种.笔…

【论文阅读】PETRv2: A Unified Framework for 3D Perception from Multi-Camera Images

Q: 论文如何解决这个问题&#xff1f; A: 论文通过提出PETRv2框架来解决多相机图像的3D感知问题&#xff0c;具体方法包括以下几个关键点&#xff1a; 时间建模&#xff08;Temporal Modeling&#xff09;&#xff1a; 通过3D坐标对齐&#xff08;3D Coordinates Alignment&…

AI应用开发前景与目标

前景与目标 什么是AIGC AIGC最基本的能力是生成内容&#xff0c;包括文本、图像、视频、代码、3D内容或者几种媒介类型转换组合 形成的“多模态内容”。生成算法、预训练模型、多模态等技术累积融合&#xff0c;以及深度模型方面的 技术创新&#xff0c;共同催生了AIGC的大爆…

一篇文章教你如何在Android上使用QPython高效编程

导语&#xff1a;你是否想在Android设备上体验Python编程的乐趣&#xff1f;QPython是一款强大的Python脚本引擎&#xff0c;让你在手机上也能轻松编写和运行Python代码。本文将带你了解QPython的使用方法&#xff0c;让你随时随地开启编程之旅&#xff01; 一、认识QPython Q…

File 34

package File;import java.awt.*; import java.io.File;public class file1 {public static void main(String[] args) {//创建FILE对象&#xff0c;指代某个具体的文件//路径分隔符File f1new File("C:/Users/SUI/Desktop/kaishi/nih.txt");// File f1new File(&quo…

推荐4款比转转大师还好用的专业数据恢复软件。

数据已经成为我们生活和工作中不可或缺的一部分&#xff1b;然而我们在很多的场景当中都会导致数据丢失&#xff1b;于是数据恢复工具便成了一些人的常用工具。很多人都知道转转大师数据恢复软件&#xff0c;但是也有其他的恢复软件也很好用。 1、福昕恢复 直通车&#xff1a;…

ArkTS通用属性

目录 一、尺寸设置 宽高&#xff0c;外边距&#xff0c;内边距&#xff0c;尺寸size layoutWeight constraintSize 二、位置设置 align direction position offset 使用Edge方式position,offset 三、布局约束 aspectRatio displayPriority 四、Flex布局 flexBas…

数字转罗马字符

import java.util.Scanner;/*** author gyf* ClassName Test* Date 2024/7/31 17:14* Version V1.0* Description : 方法一*/ public class Test {public static void main(String[] args) {Scanner scanner new Scanner(System.in);System.out.println("请输入一个字符串…

php类与对象

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文主要整理php类与对象相关的知识点 适合有编程基础的人观看 因为我这个也是整理第n语言&#xff0c;这些老套的概念就不再多啰嗦了。 直接整理相应的语法 感觉把php当第一语言学的人不太多了 快速理解类与对…

MyBatis的example.createCriteria()方法学习记录

目录 一、mapper的crud方法:1. insert方法insert(User user)insertSelective(User user) 2. select方法selectByPrimaryKey(id)selectByExample(example)selectCountByExample(example) 3. update方法updateByPrimaryKey(User user)updateByPrimaryKeySelective(User user)upda…

从零开始的MicroPython(六)ADC

上一篇&#xff1a;PWM 文章目录 ADC是什么ESP32的ADC代码 ADC是什么 ADC的英文全称是Analog / Digital Converter&#xff0c;是将模拟信号转换为数字信号的转换器&#xff0c;ADC是单片机读取传感器信号的常见方式。 我们日常生活中的信号&#xff0c;例如光照强度&#xf…

机器学习练手(三):基于决策树的iris 多分类和波士顿房价预测

总结&#xff1a;本文为和鲸python 可视化探索训练营资料整理而来&#xff0c;加入了自己的理解&#xff08;by GPT4o&#xff09; 原活动链接 原作者&#xff1a;vgbhfive&#xff0c;多年风控引擎研发及金融模型开发经验&#xff0c;现任某公司风控研发工程师&#xff0c;对…

python通过pyautogui自动给微信聊天窗口发消息

使用py脚本自动给聊天窗口发消息 1.突然的自我2.编写脚本玩一把i.先获取窗口位置ii.模拟聊天iii.疗效不错呢 1.突然的自我 突然想到pyautogui可以做那么事情&#xff0c; 那么是不是可以模拟聊天呢&#xff0c;如果结合现在的大模型chatGPT一边问然后得到结果一边自动和别人聊…

一文读懂新版Nacos的使用方式

文章目录 什么是 NacosNacos 架构Nacos 的本地启动 构建提供者 provider-nacos-8081搭建环境编写配置文件 application.yaml构建数据库编写业务实体类控制器类逻辑层与数据层接口 模块结构 构建消费者 consumer-nacos-8080搭建环境编写 yaml 文件配置编写业务编写配置类编写 Co…

Linux系统之NFS服务配置

准备工作 克隆两台linux&#xff0c;并更改其Mac地址&#xff0c;作为NFS客户端&#xff1b;将服务器更名为学号nfsserver&#xff0c;配置IP地址为192.168.学号.1 将客户端Client1更名为学号client1&#xff0c;配置IP地址为192.168.学号.2 将客户端Client2更名为学号clien…

达梦数据库一体机在宜昌市财政局上线了!

财政作为国家治理的基础和重要支柱&#xff0c;其数字化转型已成为构建现代财政制度的必由之路&#xff0c;引领着财政管理体系向更高效、更智能的方向迈进。 达梦数据全面助力财政信息化转型与智能化发展&#xff0c;采用 DAMEGN PAI I 系列数据库一体机&#xff0c;为宜昌市财…

python实现图像分割算法3

python实现区域增长算法 算法原理基本步骤数学模型Python实现详细解释优缺点应用领域区域增长算法是一种经典的图像分割技术,它的目标是将图像划分为多个互不重叠的区域。该算法通过迭代地合并与种子区域相似的邻域像素来实现分割。区域增长算法通常用于需要精确分割的场景,如…

css实现文字根据条件渐变

body 选择器 body { padding: 50vh 0; text-align: center; font-size: 6em; } padding: 50vh 0; 设置了body的上下内边距为视口高度的50%&#xff0c;左右内边距为0。text-align: center; 使得body内的文本内容居中显示。font-size: 6em; 设置了字体大小为当前字体尺寸的6倍…

Solana 自建节点搭建教程:手把手教你成为区块链网络的重要一员

区块链技术正在迅速改变世界&#xff0c;而Solana作为新一代高性能公链&#xff0c;以其出色的性能和低廉的交易费用吸引了众多开发者和用户。如果你想成为Solana生态系统的一部分&#xff0c;搭建自己的Solana节点是一个绝佳的选择。本教程将详细介绍如何一步步搭建Solana自建…