控制器之间的数据传递——通知传值

HID报告描述符实战解析:从Usage到Item的完整设计流程 本文深入解析了HID报告描述符的设计流程,从核心概念Usage(用途定义)入手,详细阐述了如何通过Item(条目)的三种角色——全局、局部与主干,构建出能被系统正确识别的设备“说明书”。文章以标准USB鼠标和键盘为例进行实战拆解,并介绍了使用Report ID与自定义设备等进阶设计方法,帮助开发者掌握这一实现USB设备即插即用的关键技术。 阅读详情

通知传值

我们先在这里约定:界面1传值到界面2为顺传,界面2传值到界面1为逆传

通知中心是一个单例,不管在哪个文件注册,也不管注册多少个,通知中心都是同一个。

一. 实现步骤

  1. 在界面2注册一个通知中心并指定通知名称,通知的信息就是要传递的数据,发布通知

  2. 在界面1注册一个通知中心,添加界面1为观察者,当有相同名字的通知时,就执行指定方法

  3. 在实现通知的方法中,进行赋值操作

  4. 在界面1中移除通知

二. 通知的优缺点

优点:

  1. 代码简洁,实现简单

  2. 一对多的方式,对于一个发出的通知,多个对象能够做出反应

  3. 控制器能通过通知传递context对象(dictionary),context对象携带了关于发送通知的自定义的信息
    注:context对象:通俗的理解是一个公共的容器

缺点:

  1. 在编译期不会检查通知是否能够被观察者正确的处理,应用的执行过程难跟踪

  2. 控制器发出通知后,不能从观察者获得任何的反馈信息

  3. 在释放注册的对象时,需要在通知中心取消注册

  4. 观察者需要提前知道通知名称和字典各个键名,如果这些不在工作区间内定义,那么会出现不同步的情况

三. 具体代码

1. AppDelegate类

---------- AppDelegate.m文件

#import "AppDelegate.h"
#include "OneViewController.h"

@interface AppDelegate ()

@end

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

  // 1. 创建窗口
  self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];

  // 2. 创建窗口的根控制器
  // 2.1 创建导航控制器的根控制器
  UIViewController *oneVc = [[OneViewController alloc] init];
  // 2.2 创建导航控制器
  UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:oneVc];
  // 2.3 给窗口设置根控制器
  self.window.rootViewController = nav;

  // 3. 设置窗口为主窗口并显示窗口
  [self.window makeKeyAndVisible];

  // 隐藏导航控制器的导航条
  nav.navigationBarHidden = YES;

  return YES;
}

@end

2. OneViewController类

---------- OneViewController.m文件

#import "OneViewController.h"
#import "TwoViewController.h"

@interface OneViewController ()

@property (nonatomic,strong) UITextField *textField;

@end

@implementation OneViewController

- (void)viewDidLoad {
  [super viewDidLoad];

  //设置控制器View的背景颜色
  self.view.backgroundColor = [UIColor greenColor];

  // 创建点击按钮
  UIButton *clickBtn = [UIButton buttonWithType:UIButtonTypeCustom];
  clickBtn.frame = CGRectMake(10, 100, 80, 40);
  clickBtn.backgroundColor = [UIColor whiteColor];
  [clickBtn setTitle:@"到界面2" forState:UIControlStateNormal];
  [clickBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
  [clickBtn setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted];
  [clickBtn addTarget:self action:@selector(btnClick) forControlEvents:UIControlEventTouchUpInside];
  [self.view addSubview:clickBtn];

  // 创建文本框
  _textField = [[UITextField alloc] initWithFrame:CGRectMake(10, 150, 250, 40)];
  _textField.borderStyle = UITextBorderStyleRoundedRect;
  _textField.backgroundColor = [UIColor whiteColor];
  [self.view addSubview:_textField];


  // 注册一个通知
  NSNotificationCenter *notification = [NSNotificationCenter defaultCenter];
  // 添加控制为观察者,收到通知就执行changeValue:方法
  [notification addObserver:self selector:@selector(changeValue:) name:@"passData" object:nil];

}

#pragma mark - 接收到通知后执行的方法

- (void)changeValue:(NSNotification *) notification {

  // 从字典中取值
  _textField.text = [notification userInfo][@"info"];

}

#pragma mark - 点击事件

- (void)btnClick {

  // 创建界面2,并压入栈
  TwoViewController *twoVc = [[TwoViewController alloc] init];
  [self.navigationController pushViewController:twoVc animated:YES];

}

-(void)dealloc{

  // 移除观察者
  [[NSNotificationCenter defaultCenter] removeObserver:self];

}

@end

3. TwoViewController类

---------- TwoViewController.m文件

#import "TwoViewController.h"

@interface TwoViewController ()

@property (nonatomic,strong) UITextField *textField;

@end

@implementation TwoViewController

- (void)viewDidLoad {
    [super viewDidLoad];

  //设置控制器View的背景颜色
  self.view.backgroundColor = [UIColor yellowColor];

  // 创建点击按钮
  UIButton *clickBtn = [UIButton buttonWithType:UIButtonTypeCustom];
  clickBtn.frame = CGRectMake(10, 100, 80, 40);
  clickBtn.backgroundColor = [UIColor whiteColor];
  [clickBtn setTitle:@"传 值" forState:UIControlStateNormal];
  [clickBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
  [clickBtn setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted];
  [clickBtn addTarget:self action:@selector(btnClick) forControlEvents:UIControlEventTouchUpInside];
  [self.view addSubview:clickBtn];

  // 创建文本框
  _textField = [[UITextField alloc] initWithFrame:CGRectMake(10, 150, 250, 40)];
  _textField.borderStyle = UITextBorderStyleRoundedRect;
  _textField.backgroundColor = [UIColor whiteColor];
  [self.view addSubview:_textField];
}

#pragma mark - 点击事件

- (void)btnClick {

  // 注册一个通知
  NSNotificationCenter *notification = [NSNotificationCenter defaultCenter];
  // 发布通知,把要传递的数据存入字典中,
  [notification postNotificationName:@"passData" object:self userInfo:@{@"info":_textField.text}];

  // 跳转界面
  [self.navigationController popViewControllerAnimated:YES];

}

@end
基于YOLOv8改进的目标检测算法研究及毕设实现全流程指南 在PyTorch中定义改进后的YOLOv8模型。首先,导入相关的库和模块,然后定义骨干网络、颈部和头部的结构。# 这里定义骨干网络的结构,例如使用改进的CSP结构# 卷积层、批归一化层、激活函数等# 更多的卷积层、批归一化层、激活函数等# 其他层...# 其他层的输出...然后,定义颈部和头部的结构,类似地,将注意力机制和特征增强方法集成到模型中。本毕设以YOLOv8为基础,通过集成注意力机制、应用特征增强技术等方法,改进了目标检测算法。 阅读详情

相关推荐

Jupyter Lab 无法启动 Kernel 问题排查与解决总结

使用 curl,telnet,或 Python websocket-client 库可以本地模拟 WebSocket 握手行为,帮助分析服务端响应状态。避免使用 http:// + ws:// 组合方式部署 Jupyter Lab,特别是在远程或跨域访问场景。建议统一采用 https:// + wss:// 方式部署,确保浏览器信任并兼容。确认 WebSocket 已升级为 wss://,内核可正常启动。但在远程访问时,浏览器出于安全策略,默认拒绝 ws:// 协议。

weixin_43866043的博客 1854

MVC-控制器之间的数据传递

MVC-控制器之间的数据传递前端程序设计后台代码设计效果 控制器之前的数据传递一般使用 TempData。下面以一个例子来展示: 前端程序设计 建立两个控制器,Home控制器和Test控制器。 建立两个Html页面,一个位于Home文件夹下的Index.cshtml,一个位于Test文件夹下的Index.cshtml,代码如下: Home下的:Index.cshtml,用来做数据提交。 <!DOCTYPE html> <html> <head> <meta

weixin_42485675的博客 1628

N5105核显直通PVE:从黑屏到HDMI输出的完整指南

PCI直通能让虚拟机独占物理设备,但核显直通远没有独显那么轻松。Intel核显与CPU、显示输出链路的强耦合使UEFI引导、GOP驱动、驱动签名等环节都成了黑屏陷阱。在PVE虚拟化环境中,通过IOMMU开启、vfio-pci绑定、OVMF固件和Q35机型配合,可以绕过KVM检测,让Windows虚拟机正确驱动核显,从HDMI口输出画面,并解锁Intel Quick Sync硬解能力。这种方案尤其适合N5105等低功耗迷你主机,可作为客厅HTPC、本地视频硬解或依赖硬件加速的轻量工作台。本文基于N5105平台

weixin_31082403的博客 374

thinkphp5 两个控制器传参数_参数绑定 · ThinkPHP5+控制器 · 看云

#### 参数绑定虽然提供了助手函数,在操作方法中读取请求变量的方式还是比较麻烦,使用参数绑定可以进一步简化请求变量的读取,我们通过hello方法的代码来对比下前后两种请求变量的获取方式。不使用参数绑定的方式:~~~namespace app\index\controller;class Index{public function hello(){// 获取当前的请求变量return reques...

weixin_31499719的博客 371

K-means算法代码实现(python)

K-means算法代码实现以及解决质心选择问题 计算距离 距离通常使用欧几里得距离来衡量 def euclDistance(vector1, vector2): return np.sqrt(sum((vector2 - vector1) ** 2)) 初始化质心 def initCentroids(data, k): numSamples, dim = data.shape ...

江南小帅瓜的博客 1万+

从零到一:基于Docker与Gewechat协议,打造高可用微信AI助手

本文提供了一份从零开始的实战指南,详细讲解如何利用Docker容器化技术与Gewechat协议,构建一个高可用、低风险的微信AI助手。通过整合Dify AI平台,您可以为微信机器人注入大语言模型的智能,实现自动问答、知识库查询等高级功能,显著提升个人或团队在微信场景下的沟通与信息处理效率。

weixin_29280657的博客 160

tp5控制器内调用其他控制器方法并传参

//请求的主要内容 $info = [ $this->location['province'], $this->location['city'], $this->location['district'] ]; dump(action('api/agent' ,...

程序员大柱 1461

计算数列位置N的值

本文介绍了一个数列生成问题,要求根据输入的两个整数M和N生成特定规则的数列,并输出第N个位置上的数值。数列生成规则为:前M个元素为1到M;后续元素根据前M个元素是否重复来决定计算方式(求和或求差)。文章提供了C++、Java和Python三种语言的实现方案,均包含输入处理、数列初始化、循环计算和结果输出等步骤。各语言实现中均使用集合去重特性判断重复元素,并通过内置函数或自定义方法求取最大值和最小值。该问题主要考察基础编程能力,包括数组/列表操作、最值计算和重复元素判断等基本编程技巧。

面试高手的博客 652

控制器之间的数据传递——属性传值

一、属性传值 我们先在这里约定:界面1传值到界面2为顺传,界面2传值到界面1为逆传 (一). 顺传 界面2需要有一个用于接收数据的属性 界面2在压入栈之前,把界面1中的数据直接赋值给界面2的属性 界面2压入栈,实现跳转到界面2 (二). 逆传 界面1需要有一个用于接收数据的属性 界面2需要有一个用于保存界面1的属性 界面2在压入栈之前,把界面1控制器赋值给界面2的属性 在界

诠释完美 2822

YOLOv13改进策略【Backbone/轻量化】| 替换骨干网络 CVPR-2024 StarNet,超级精简高效的轻量化模块

本文记录的是。StarNet设计简洁,没有复杂的设计和精细调整的超参数,仅是一个 4 阶段的分层架构。并且其中能够在低维空间计算的同时考虑极高维的特征这一特性,进而提高模型精度。本文在替换骨干网络中配置了原论文中的starnet_s1starnet_s2starnet_s3和starnet_s4七种模型,以满足不同的需求。

Limiiiing的博客 669

Unreal5从入门到精通之如何录制360°VR全景视频

摘要:本文详细介绍了使用虚幻引擎(UE)生成360°全景视频的完整流程。首先需启用MovieRender Queue和Panoramic Capture插件,准备场景并设置相机序列。通过影片渲染队列选择8K分辨率输出PNG序列帧,利用ffmpeg工具转换为MP4格式,最终获得高精度全景视频。该方法适用于VR内容开发,能以较低性能消耗实现影院级画质,特别适合冥想类应用场景。教程涵盖从插件配置到后期合成的全链路操作,为开发者提供高效的全景内容生产解决方案。(150字)

TxNet 1402

ios 之页面传值的几种方式

第二个视图控制器如何获取第一个视图控制器的部分信息 例如 :第二个界面中的lable显示第一个界面textField中的文本 这就需要用到属性传值、block传值 那么第一个视图控制器如何获的第二个视图控制器的部分信息 例如:第一个界面中的lable显示第二个界面textField中的文本 这就需要使用代理传值 页面间传值有八大传值方式,下面我们就简单介绍下页面间常用的五...

baji615346的专栏 126

把个人化的 SQVI 报表变成可维护、可共享、可传输的 ABAP Query:从定位来源到转换落地的完整路线图

本文针对SAP系统中业务用户常用但难以维护的SQVI临时报表问题,提供了一套完整的解决方案。文章首先区分了SQVI(个人临时报表)和ABAP Query(团队可维护报表)的关键差异,重点介绍了如何通过函数模块RSAQ_DECODE_REPORT_NAME反查报表来源。对于SQVI报表,详细说明了定位创建人和转换为团队可维护的ABAP Query的具体步骤,包括Query Area切换、转换操作和后续维护方法。最后总结了常见问题的解决方案,如字段调整、口径固化和生成程序名反查等,为现场实施提供了可直接操作的完

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 302

iOS 页面间几种传值方式(属性,代理,block,单例,通知)

第二个视图控制器如何获取第一个视图控制器的部分信息 例如 :第二个界面中的lable显示第一个界面textField中的文本 这就需要用到属性传值、block传值 那么第一个视图控制器如何获的第二个视图控制器的部分信息 例如:第一个界面中的lable显示第二个界面textField中的文本 这就需要使用代理传值 页面间传值有八大传值方式,下面我们就简单介绍...

aqlomr7170的博客 100

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

iOS 页面传值总结

1、属性传值 (1):属性传值第一步需要用到什么类型就定义什么样的属性 (2):从上一个页面到一个页面的选中方法里面将要传的值传到来(上一个页面)备注:这种方法只适用于上一个页面推到下一个页面。 如:MainViewController与SecondViewContr...

chuxuelie4798的博客 113

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

IOS的四种传值方式

在IOS界面跳转中,通常需要传值来解决一些实际问题,比如A界面跳转B界面时,需要告诉B界面显示那些内容。B界面做了某些操作之后,A界面需要做一些其他的操作等等。这些操作的数据来往,我们可以看做它在传值,所以传值不是我们一般意义的传一些数值过去,而是一些数据,可以是一些字符串,一个数组,某种状态等等。 在介绍之前,先奉上自己做的Demo:https://github.com/LOLR2017/ByValDemo iOS界面间的传值方式大概可以分为以下四种: 1.正向传值...

feelinghappy的专栏 702

iOS中的数据传递

(以A控制器->B控制器->C控制器的页面传值为例) 顺传 顺传就是在A控制器跳转至B控制器时,获取到B控制器中需要赋值的属性,对该属性进行赋值,当控制器完成跳转后,就完成了值的传递。 注意:对于跨级控制器的跳转,如A控制器与C控制器之间还有一个B控制,要将A控制器的值传到C控制器,不能使用顺传,可以使用通知。 逆传 逆传就...

dkaq53672的博客 208

UI学习——多界面传值

以上就是本篇文章的全部内容。

m0_73974920的博客 221

iOS之界面传值(通知,属性,协议,NSUserDefaults,KVC)

通知传值 通知是在跳转控制器之间常用的传值代理方式。NSNotificationCenter提供了一种解耦的方式,就是任何对象都可以发送通知到中心,同时任何对象可以监听中心的通知。 发送通知 //通知中心NSNotificationCenter,发送通知 - (IBAction)changeColorAction2:(id)sender { UIColor *color = [UIColo

╰つ栺尖篴夢ゞ 1160

iOS 通知传值(逆传)

单休的日子很有意思,很想用周日的时间好好睡觉,但是呢,还是想抽出来点时间回忆一下之前学过的知识,今天把通知逆向传值方法复习一下,慢慢复习,慢慢写,把之前学过的知识都写在博客里,希望自己能够深刻记住这些知识点,也希望能够给同行们在工作和学习上带来帮助; 少说废话,上代码: 首先有两个控制器: ViewController(我比较懒,没有自己创建控制器); SecondViewContro

抬头看山,低头看路! 1352

IOS-界面传值

第二个视图控制器如何获取第一个视图控制器的部分信息 例如 :第二个界面中的lable显示第一个界面textField中的文本 这就需要用到属性传值、block传值 那么第一个视图控制器如何获的第二个视图控制器的部分信息 例如:第一个界面中的lable显示第二个界面textField中的文本 这就需要使用代理传值 页面间传值有八大传值方式,下面我们就简单介绍下页面间常用的五种传值方式...

weixin_34392843的博客 87

ios 给网页传值_IOS常用的页面传值方式

IOS项目开发中,经常需要在不同的控制器之间跳转时进行传值操作,传值方式按传递的方向分为正向传值和逆向传值,正向传值比较好理解,就比如A控制器Push跳转至B控制器时,在A控制器中获取到B控制器的实例化对象,对B控制器的属性进行赋值,当控制器完成跳转后,就完成了值的传递。而逆向传值是B控制器Pop到A控制器时,对A控制器的某个属性进行赋值,虽然在B控制器中可以获取到A控制器的实例化对象,但是不能像...

weixin_33362939的博客 198

UIViewControl之间传值的几种方式在这里做一下总结

为什么80%的码农都做不了架构师?>>> ...

weixin_33887443的博客 96
上一篇: 控制器之间的数据传递——Block传值
下一篇: 控制器之间的数据传递——全局变量传值
活在生活里
博客等级 码龄11年 94粉丝 82原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值