【iOS】多界面传值

目录

  • 前言
  • 属性传值
    • 步骤(主要涉及到属性的声明和赋值)
    • 代码示例
  • 协议(Delegation)传值
    • 步骤(涉及到定义协议、实现协议函数等)
    • 代码示例
  • 单例(Singleton )传值
    • 步骤(主要涉及到单例模式的创建)
    • 代码示例
  • 通过通知(NSNotification)传值
    • 步骤(主要涉及到通知的发布和监听)
    • 代码示例
    • 关于NSNotificationCenter
      • NSNotificationCenter主要方法:
      • 代码示例:
  • 总结

前言

  在iOS开发中,多界面传值是一个常见的问题。多界面传值的方法有很多,本篇博客主要介绍属性传值, 代理传值(即协议传值),单例传值,通知传值。
  关于另外两个多界面传值方法——闭包(block)传值和KVO(Key-Value Observing )传值,在后续的学习中,我会继续记录我的理解。

属性传值

  属性传值是一种简单而直观的方式,用于在不同界面之间传递数据。属性传值最大的特点就是正向传值,即A页面传值给B页面。需要在B中声明一个属性(之所以在B.h中定义,是因为在B.h中声明的属性,在A的文件里新创建B视图控制器后也可以访问),因为要将A中的值传给B,所以在A中定义一个B视图控制器类型的页面,然后在推入目标界面的控制器A(传递数据的界面)中将所需的值赋给新定义页面的属性。这样,目标界面的控制器B就可以访问这个属性的值了。这种方式适用于两个界面之间的直接数据传递,不涉及第三个界面。

步骤(主要涉及到属性的声明和赋值)

1.在目标视图控制器(接收数据的视图控制器)中定义一个公开的属性,用于接收数据。
2.在源视图控制器(传递数据的视图控制器)中设置目标视图控制器的这个属性。

代码示例

// 在目标视图控制器中定义属性(.h文件)
@interface TargetViewController : UIViewController
@property (nonatomic, strong) NSString *receivedData;
@end//记得引用目标视图控制器的.h文件
// 在源视图控制器中设置属性(.m文件)
TargetViewController *targetVC = [[TargetViewController alloc] init];
targetVC.receivedData = @"Hello, World!";
[self.navigationController pushViewController:targetVC animated:YES];

  属性传值更适合于同一组件内的数据传递,例如在一个视图控制器内部的不同视图之间传递数据

协议(Delegation)传值

  协议传值是一种反向传值的方式,即B页面(发送数据页面,即源视图控制器)传值给A页面(接收数据页面,即目标视图控制器)在B页面,定义一个代理协议定义协议实现函数,并定义一个属性该属性需要定义一个协议(代理)对象,来记录需要传递的值注意为id类型(实例类型)在B页面的合适时机调用协议实现函数(即代理对象会执行协议函数,从而达到改变代理对象本身属性的目的)。然后令接收数据的页面A在.h文件遵循B里的协议,并在A的.m文件内实现该协议函数,从而完成B向A的反向传值。

步骤(涉及到定义协议、实现协议函数等)

1.在源视图控制器中定义一个协议(delegate),并声明相应的方法,然后声明一个代理对象。
2.在目标视图控制器中遵循协议,实现该协议的方法,并设置目标视图控制器的代理。

代码示例

// 在源视图控制器B(发送数据)中定义协议
@protocol TargetViewControllerDelegate <NSObject>
//声明相应的方法(需要传什么就设置成什么类型)
- (void)didReceiveData:(NSString *)data;
@end@interface TargetViewController : UIViewController
//设置代理对象
@property (nonatomic, weak) id<TargetViewControllerDelegate> delegate;
@end// 在目标视图控制器A(接收数据)中遵循协议(记得引用源视图控制器的.h文件)
@interface SourceViewController : UIViewController <TargetViewControllerDelegate>
@end@implementation SourceViewController
//实现协议方法
- (void)didReceiveData:(NSString *)data {NSLog(@"Received data: %@", data);
}
@end

  协议传值适合用于不同组件间灵活的数据交互,特别是当某些数据需要从子组件向父组件传递时

单例(Singleton )传值

  单例传值是一种更为高级的数据传递方式,适用于在多个界面之间传递数据。通过创建一个单例对象在整个应用生命周期内保持其唯一实例并在任何界面中访问它。你可以在单例对象中存储和更新数据,然后在需要的地方获取这些数据。这种方式的优势在于可以在多个界面之间共享数据,而无需在每个界面之间传递数据

“在整个应用生命周期内保持其唯一实例”意味着在应用程序运行的整个时间里,特定的类或对象只会存在一个实例,并且这个实例在整个应用中是唯一的、全局可访问的。简单来说,就是确保在应用的启动到终止期间,这个类的实例只有一个,而且这个实例可以被整个应用程序中的所有代码共享和使用。

  1. 唯一实例
    唯一实例(Single Instance)指的是一个类在应用生命周期内只有一个对象实例。即便在不同的地方或多个线程中请求这个类的实例,也只会返回同一个对象。
  2. 应用生命周期
    应用生命周期指的是从应用程序启动到退出的整个过程。在这个过程中,应用程序会经历启动、运行、后台、终止等不同状态,但唯一实例的对象应该在这整个过程中保持不变。
  3. 全局访问
    通过单例模式创建的唯一实例在应用程序的任何地方都可以被访问。这样,所有需要访问该对象的部分都能够引用同一个实例,从而保证数据的一致性和操作的同步。

步骤(主要涉及到单例模式的创建)

1.创建一个 Singleton 类,用于存储需要传递的数据。
2.在源视图控制器中设置数据,在目标视图控制器中获取数据。

代码示例

// Singleton 类
@interface DataStore : NSObject
//需要保存或传递什么数据类型,就声明成什么类型
@property (nonatomic, strong) NSString *sharedData;
+ (instancetype)sharedInstance;
@end@implementation DataStore
+ (instancetype)sharedInstance {// 静态变量,存储单例实例static DataStore *sharedInstance = nil;// 用于确保代码块只执行一次的标记static dispatch_once_t onceToken;// 确保仅创建一个实例dispatch_once(&onceToken, ^{sharedInstance = [[self alloc] init];});return sharedInstance;
}
@end// 在源视图控制器中设置数据(记得引用单例的.h文件)
[DataStore sharedInstance].sharedData = @"Hello, World!";// 在目标视图控制器中获取数据(记得引用单例的.h文件)
NSString *data = [DataStore sharedInstance].sharedData;
NSLog(@"Received data: %@", data);

通过通知(NSNotification)传值

  除了以上三种方式,还可以使用通知中心(Notification Center)进行多界面传值。通知中心是iOS提供的一个事件通知机制,可以用来在不同的界面之间传递数据。通过创建一个通知中心,并在需要传递数据的界面中发送通知,可以在不直接引用其他界面的情况下传递数据。你可以将要传输的数据作为通知的一部分发送出去,然后在接收通知的界面中处理这些数据。这种方式适用于在不同界面之间传递少量数据或者执行一些异步操作

步骤(主要涉及到通知的发布和监听)

1.在需要发送数据的视图控制器中发送通知。
2.在接收数据的视图控制器中监听该通知。

代码示例

// 源视图控制器发送通知
[[NSNotificationCenter defaultCenter] postNotificationName:@"DataNotification" object:@"Hello, World!"];// 目标视图控制器监听通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNotification:) name:@"DataNotification" object:nil];- (void)handleNotification:(NSNotification *)notification {NSString *data = notification.object;NSLog(@"Received data: %@", data);
}

关于NSNotificationCenter

  NSNotificationCenter 提供了一种机制来发布和接收通知。通知是一个广播机制,允许应用程序的不同部分在不直接知道彼此的情况下交换信息。NSNotificationCenter 是一个中心化的系统,用于处理通知的发布和接收。

NSNotificationCenter主要方法:

defaultCenter:获取 NSNotificationCenter 的共享实例。
发布通知:通过调用 postNotificationName:object:userInfo: 方法,发送一个通知到 NSNotificationCenter。
注册观察者:通过调用 addObserver:selector:name:object: 方法,注册一个观察者来接收特定通知。
移除观察者:通过调用 removeObserver: 方法,可以移除一个观察者,停止接收通知。

代码示例:

发布通知(一般在源视图控制器里):

// 发布通知(一般在源视图控制器里使用)
[[NSNotificationCenter defaultCenter] postNotificationName:@"MyNotification" object:nil userInfo:@{@"Key": @"Value"}];postNotificationName::通知的名称
object::发送通知的对象(通常可以是 nil)
userInfo::一个字典,可以用来附加额外的信息(可以是 nil)

注册观察者(一般在目标视图控制器里):

// 注册观察者(一般在目标视图控制器里使用)
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNotification:) name:@"MyNotification" object:nil];addObserver::观察者对象(通常是 self)
selector::观察者接收到通知时调用的方法(在后面要进行该方法的实现)
name::要接收的通知的名称
object::要观察的对象(通常可以是 nil,表示接收所有该名称的通知)

移除观察者(在不再需要接收通知时,移除观察者):

// 移除观察者
[[NSNotificationCenter defaultCenter] removeObserver:self];removeObserver: 你要移除的观察者对象

为什么需要移除观察者?
避免内存泄漏:如果对象在被释放后仍然注册为观察者,它会继续接收通知,这可能导致尝试访问已经释放的内存,从而引发崩溃。
防止异常:如果观察者对象已经被销毁,但通知系统仍尝试发送通知给它,可能会导致运行时异常。
资源管理:移除不再需要的观察者可以减少系统资源的消耗,避免不必要的消息传递。

移除观察者的情况:
视图控制器的释放:在视图控制器的 dealloc 方法中,通常会移除该视图控制器作为通知的观察者,以避免在视图控制器被销毁后,仍然收到通知。
临时注册:如果观察者对象只是临时使用的,确保在适当的时候移除它,以防止继续接收不需要的通知。
对象生命周期结束:当对象不再需要接收通知时,例如在任务完成或对象状态变化时,应该移除观察者。

总结

  属性传值适用于两个界面之间的直接数据传递;
  协议传值适合用于不同组件间灵活的数据交互;
  单例传值适用于在多个界面之间共享数据;
  通过通知中心进行传值则适用于在不同界面之间传递少量数据或者执行异步操作;

  iOS多界面传值有多种方式可供选择在实践中,根据具体情况选择合适的方式可以有效地解决多界面数据传递的问题,提高代码的效率和可维护性,提升应用的用户体验和性能。此外,为了保持应用的性能和稳定性,需要注意避免过度使用数据传递。过度依赖数据传递可能导致代码的耦合度增加,不利于维护和扩展。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安装nodejs服务器

Java项目可以运行在tomcat服务器&#xff0c;开始完成前后端完全分离。前端有自己独立的工程。我们需要把前端独立的工程运行起来。 运行在nodejs服务器下。 验证是否安装成功&#xff1a;敲cmd--输入node --version 1.安装npm java项目需要依赖jar,安装maven。前端项目也需要依…

Vitis HLS 完美嵌套循环通过 m_axi 接口读取DDR 的迭代次数细粒度控制实验 — 问题描述

1 自媒体账号 目前运营的自媒体账号如下&#xff1a; 哔哩哔哩 【雪天鱼】: 雪天鱼个人主页-bilibili.comCSDN 【雪天鱼】: 雪天鱼-CSDN博客 QQ 学习交流群 FPGA科研硕博交流群 910055563 (进群有一定的学历门槛&#xff0c;长期未发言会被请出群聊&#xff0c;主要交流FPG…

免费!OpenAI发布最新模型GPT-4o mini,取代GPT-3.5,GPT-3.5退出历史舞台?

有个小伙伴问我&#xff0c;GPT-4O mini是什么&#xff0c;当时我还一脸懵逼&#xff0c;便做了一波猜测&#xff1a; 我猜测哈&#xff0c;这个可能是ChatGPT4o的前提下&#xff0c;只支持文本功能的版本&#xff0c;速度更快 结果&#xff0c;大错特错。 让我们一起看看Open…

【简单介绍Gitea】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

吴恩达老师机器学习-ex4

梯度检测没有实现。有借鉴网上的部分 导入相关库&#xff0c;读取数据 因为这次的数据是mat文件&#xff0c;需要使用scipy库中的loadmat进行读取数据。 通过对数据类型的分析&#xff0c;发现是字典类型&#xff0c;查看该字典的键&#xff0c;可以发现又X&#xff0c;y等关…

类和对象【下】

一、类的默认成员函数 默认成员函数从名字就告诉我们何为默认成员函数&#xff0c;即&#xff1a;用户没有实现&#xff0c;编译器默认自动实现的函数。 这时你不禁一喜&#xff0c;还有这好事&#xff0c;编译器给我打工&#xff0c;那么&#xff0c;我们今天都来了解一下都有…

漏洞复现-路由器TOTOLINK-A6000R-RCE

本文来自无问社区&#xff0c;更多漏洞信息可前往查看http://wwlib.cn/index.php/artread/artid/14996.html 0x01 产品简介 TOTOLINK A6000R是一款性能卓越的无线路由器&#xff0c;采用先进的技术和设计&#xff0c;为用户提供出色的网络体验。其支持最新的Wi-Fi标准&#x…

锅总详解开源组织之ASF

ASF是什么&#xff1f;ASF孵化的顶级项目有哪些&#xff1f;ASF顶级项目商用化有哪些&#xff1f;涉及的版权是什么&#xff1f;应用案例有哪些&#xff1f;衍生项目及其关联是什么&#xff1f;希望本文能帮您解答这些疑惑&#xff01; 一、ASF简介 Apache Software Foundati…

Centos7.6安装Nginx(yum安装和源码安装)

Centos7.6安装Nginx&#xff08;yum安装和源码安装&#xff09; 简介 yum安装 源码安装 安装后的事情 常见问题 简介 Nginx&#xff08;发音为“engine X”&#xff09;是一个高性能的HTTP和反向代理服务器&#xff0c;也可以作为邮件代理服务器使用。它被广泛应用于高流量…

程序员面试中的“八股文”:是助力还是阻力?

“八股文”在实际工作中是助力、阻力还是空谈&#xff1f; 作为现在各类大中小企业面试程序员时的必问内容&#xff0c;“八股文”似乎是很重要的存在。但“八股文”是否能在实际工作中发挥它“敲门砖”应有的作用呢&#xff1f;有IT人士不禁发出疑问&#xff1a;程序员面试考…

使用 ChatGPT 检测媒体偏见的潜力和局限性

概述 随着数字时代的到来&#xff0c;信息瞬间传遍全球&#xff0c;但其中也不乏各种偏见。媒体偏见"&#xff0c;即对某些观点的选择性报道&#xff0c;会影响人们对某一事件或问题的看法&#xff0c;并对公众舆论产生重大影响。事实上&#xff0c;许多人都认为主要媒体…

Data Augmentation数据增强

目录 数据增强是什么 为什么数据增强 数组增强分类 有监督数据增强 无监督数据增强 数据增强是什么 数据增强又称数据扩增&#xff0c;是一种通过应用合理且随机的变换&#xff08;例如图像位移、旋转&#xff09;来增加训练集多样性的技术。让有限的数据产生等价于更多数…

现在有什么赛道可以干到退休?

最近&#xff0c;一则“90后无论男女都得65岁以后退休”的消息在多个网络平台流传&#xff0c;也不知道是真是假&#xff0c;好巧不巧今天刷热点的时候又看到一条这样的热点&#xff1a;现在有什么赛道可以干到退休&#xff1f; 点进去看了几条热评&#xff0c;第一条热评说的…

自动化测试概念篇

目录 一、自动化 1.1 自动化概念 1.2 自动化分类 1.3 自动化测试金字塔 二、web自动化测试 2.1 驱动 2.2 安装驱动管理 三、selenium 3.1 ⼀个简单的web自动化示例 3.2 selenium驱动浏览器的工作原理 一、自动化 1.1 自动化概念 在生活中&#xff1a; 自动洒水机&am…

为什么说脱离决策的数据分析都是无用功

如果你问我数据分析师最重要的能力是什么&#xff0c;我的回答是数据驱动决策&#xff0c;这是数据分析师最值钱的能力&#xff0c;没有之一。 因为数据的价值在于挖掘&#xff0c;与业务和市场进行关联&#xff0c;找到机会点。抛开这个&#xff0c;数据本身一文不值&#xf…

deployment

一.deployment rc和rs控制器都是控制pod的副本数量的&#xff0c;但是&#xff0c;他们两个有个缺点&#xff0c;就是在部署新版本pod或者回滚代码的时候&#xff0c;需要先apply资源清单&#xff0c;然后再删除现有pod&#xff0c;通过资源控制&#xff0c;重新拉取新的pod来实…

杭州东网约车管理再出行方面取得的显著成效

随着科技的飞速发展&#xff0c;网约车已成为人们日常出行的重要选择。在杭州这座美丽的城市&#xff0c;网约车服务更是如雨后春笋般蓬勃发展。特别是杭州东站&#xff0c;作为杭州的重要交通枢纽&#xff0c;网约车管理显得尤为重要。近日&#xff0c;沧穹科技郑重宣告已助力…

昇思25天学习打卡营第XX天|Pix2Pix实现图像转换

Pix2Pix是一种基于条件生成对抗网络&#xff08;cGAN&#xff09;的图像转换模型&#xff0c;由Isola等人在2017年提出。它能够实现多种图像到图像的转换任务&#xff0c;如从草图到彩色图像、从白天到夜晚的场景变换等。与传统专用机器学习方法不同&#xff0c;Pix2Pix提供了一…

Java抽象类和抽象方法

以下文章只是自己十分粗浅的理解&#xff0c;和简单的使用方法&#xff0c;没有很深度的学习理解 Java的抽象类和抽象方法都是使用abstract关键字进行修饰。 抽象类 声明格式&#xff1a;" abstract 权限修饰符 class 类名 {...} " 抽象方法 声明格式&#xff1a;“…

Seata 入门与实战

一、什么是 Seata Seata 是一款开源的分布式事务解决方式&#xff0c;致力于提供高性能和简单易用的分布式事务服务。Seata 为用户提供了 AT、TCC、SAGA 和 XA 事务模式&#xff0c;为用户打造一站式的分布式事务解决方案。 二、Seata 组成 事务协调者&#xff08;Transacti…