ios 监听一个控制器的属性_ios - kvo观察者示例(监听类的属性变化)

首先创建Person分类

#import

@interface Person : NSObject

@property (nonatomic, copy) NSString *name;

@property (nonatomic, assign) float height;

@end

.m中不做任何事情

控制器.m中

#import "ViewController.h"

#import "Person.h"

@interface ViewController ()

@property (nonatomic, strong) Person *per;

@end

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

Person * per = [Person new];

per.name = @"zhangsan";

per.height = 1.2;

self.per = per;

// kvo 为per.name添加观察者

[per addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];

// kvo 为per.height添加观察者

[per addObserver:self forKeyPath:@"height" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];

}

只要监听的属性name 和 height的值发生了改变就会触发下面的方法

/** 添加观察者必须要实现的方法 */

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{

/** 打印新老值 */

// 从打印结果看 分别打印出了 name 与 height的新老值

NSLog(@"old : %@ new : %@",[change objectForKey:@"old"],[change objectForKey:@"new"]);

// NSLog(@"keypath : %@",keyPath);

// NSLog(@"change : %@",change);

}

由于对person.name 以及height的属性都做了监听,只要触摸后属性的值发生改变就做得到通知触发通知方法 -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 则可以在其内部做你想要做的事

/** 触摸改变per.name属性值 */

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{

self.per.name = @"helloworld";

self.per.height = 3.3;

}

一定要记得移除

/** 移除 */

-(void)dealloc{

[self.per removeObserver:self forKeyPath:@"name" context:nil];

[self.per removeObserver:self forKeyPath:@"height" context:nil];

}

- (void)didReceiveMemoryWarning {

[super didReceiveMemoryWarning];

// Dispose of any resources that can be recreated.

}

@end

注意点:

为某个对象的某个属性添加观察者,最后一定要移除,否则可能会崩溃

实现方法-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context则只要监听的属性发生改变就会触发.

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

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

相关文章

Bugzilla 使用指南

本篇文章主要关注于如何高效合理的使用Bugzilla。 Bugzilla是一个开源的缺陷跟踪系统,它可以管理软件开发过程中缺陷的提交、修复、关闭等整个生命周期。 1. 基本概念 在Bugzilla中,Bug报告状态分为以下几种状态, 待确认的 unconfirmed 新…

MySQL explain 命令

概述 MySQL 的 explain 命令,主要用于查看实际查询过程中的一些执行细节(执行计划),也是查看优化器决定如何执行查询的主要方法 explain 使用示例 explain 的使用也很简单,在 select 语句之前增加 explain 关键字再…

r语言从giuthb安装失败_R语言install_github安装包问题

今早在看微信时,看到一篇文章介绍R可视化的数据包 - rCharts。rCharts的可用性还OK,就是安装时遇到很多坑。如果想要玩一下rCharts,希望我说的这些坑可以让你更快的完成安装。首先需要安装devtools的包,devtools包安装时&#xff…

centos6.5安装bugzilla超详细教程

经过自己的摸索,与尝试,成功在centos6.5上,安装bugzilla。并且可以发送邮件。 一、安装软件 首先,需要安装一些软件 yum install mysql-devel -y yum install mysql-server -y yum install httpd -y yum install gcc gcc-…

从numpy里加载_PyTorch强化:01.PyTorch 数据加载和处理

PyTorch提供了许多工具来简化和希望数据加载,使代码更具可读性。1.下载安装包scikit-image:用于图像的IO和变换pandas:用于更容易地进行csv解析from __future__ import print_function, divisionimport osimport torchimport pandas as pd #用…

Redmine使用手册

一、Redmine简介 Redmine是基于ROR框架开发的一套跨平台项目管理系统,是项目管理系统的后起之秀,据说是源于Basecamp的ror版而来,支持多种数据库,除了和DotProject的功能大致相当外,还有不少自己独特的功能&#xff0…

swagger2maven依赖_Maven + SpringMVC项目集成Swagger

Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。总体目标是使客户端和文件系统作为服务器以同样的速度来更新。文件的方法,参数和模型紧密集成到服务器端的代码,允许API来始终保持同步。作用&#x…

IDEA2019版最新配置SVN及上传教程-超详细图文详解

IDEA2019版配置SVN图文详解 1. 查看svn仓库 调出svn视图: 连接svn服务器: 连接后效果如下: 补充:如果输入正确的连接地址后出现错误—系统找不到指定的文件 请到设置中检查(File | Settings | Version Control | Subversion)SVC客户端路径…

openocd目录_OpenOCD的调试

Openocd的调试步骤1、前言本文档仅用于学习参考。对本文档作者保留所有权利。联系邮箱:yarakyoungqq.com2、工具本文使用的软、硬件工具如下:目标开发板:ST SPEAr310 EVB 2.0(官网www.st.com)及其交叉编译环境。仿真器:OpenJTAG(官…

dubbo:reference、dubbo:service和@Service、@Reference使用情况

以前在同一模块中Spring依赖注入&#xff0c;可以通过Service和Autowired Dubbo是远程服务调用&#xff0c;消费方需要注入提供方定义的接口实例&#xff0c;可以通过xml配置 dubbo:reference、dubbo:service <dubbo:service interface"fei.CustomerServices" …

SSM+Maven+Dubbo+Zookeeper简单项目实战以及易错注意点

最近为了熟悉Dubbo远程过程调用架构的使用&#xff0c;并结合SSMMaven整合了简单的一套项目实战 直接看项目结构图 各模块介绍 dubbo-common&#xff1a;存放项目需要的公众类&#xff0c;像查询模型、数据库实体模型等 dubbo-config&#xff1a;存放项目所需的公众配置文件&…

c++二叉树的层序遍历_leetcode 103. 二叉树的锯齿形层序遍历

按层次遍历&#xff0c;记录下对应节点的val和所在层&#xff0c;然后经过一定变换得到输出。python代码如下&#xff1a;# Definition for a binary tree node.# class TreeNode(object):# def __init__(self, x):# self.val x# self.left None# …

TCP和UDP的区别(Socket)

TCP和UDP区别 TCP和UDP编程区别 TCP编程的服务器端一般步骤是&#xff1a;   1、创建一个socket&#xff0c;用函数socket()&#xff1b;   2、设置socket属性&#xff0c;用函数setsockopt(); * 可选   3、绑定IP地址、端口等信息到socket上&#xff0c;用函数bind(); …

mysql out_mysql存储过程 in out inout

存储过程的好处存储过程是一组预编译好的sql语句&#xff0c;用来执行某个特定的功能。这样可以省去sql解析、编译、优化的过程&#xff0c;提高了执行效率&#xff0c;同时&#xff0c;在调用的时候只传一个存储过程的名称&#xff0c;而不用传一大堆sql语句&#xff0c;减少了…

Socket TCP和UDP的区别

一、UDP:(用户数据报协议) 1》将数据及源和目的封装在数据包中&#xff0c;不需要建立连接 2》每个数据包得大小限制在64KB之内 3》因为无需连接&#xff0c;因此是不可靠协议 4》不需要建立连接&#xff0c;速度快 5》需要的系统资源较少&#xff0c;结构较简单 二、TCP(传输控…

mysql级联查询_mysql 各种级联查询后更新(update select)

mysql 各种级联查询后更新(update select).CREATE TABLE tb1 (id int(11) NOT NULL,A varchar(100) default NULL,B varchar(100) default NULL,C varchar(20) default NULL,PRIMARY KEY (id),KEY id (id)) ENGINEInnoDB DEFAULT CHARSETlatin1;CREATE TABLE tb2 (id int(11)…

mysql锿法_MySQL基本用法

常用sql语句查看数据库&#xff1a; show databases;创建一个HA的数据库&#xff1a; create database HA;查看自己所处的位置&#xff1a; select database();删除数据库&#xff1a; drop database wg;创建表&#xff1a;语法&#xff1a;**create table** 表名 (**字段名** …

Java并发面试宝典,并发相关面试再也难不倒你!

1、在java中守护线程和用户线程的区别&#xff1f; java中的线程分为两种&#xff1a;守护线程&#xff08;Daemon&#xff09;和用户线程&#xff08;User&#xff09;。 任何线程都可以设置为守护线程和用户线程&#xff0c;通过方法Thread.setDaemon(bool on)&#xff1b;…

mysql open table_MySQL open table

背景&#xff1a;MySQL经常会遇到Too many open files&#xff0c;MySQL上的open_files_limit和OS层面上设置的open file limit有什么关系&#xff1f;源码中也会看到不同的数据结构&#xff0c;TABLE, TABLE_SHARE&#xff0c;跟表是什么关系&#xff1f;MySQL flush tables又…

mysql 视图 mybatis_Mybatis调用视图和存储过程的方法

现在的项目是以Mybatis作为O/R映射框架&#xff0c;确实好用&#xff0c;也非常方便项目的开发。MyBatis支持普通sql的查询、视图的查询、存储过程调用&#xff0c;是一种非常优秀的持久层框架。它可利用简单的XML或注解用语配置和原始映射&#xff0c;将接口和java中的POJO映射…