Key-Value Coding(KVC),Key-Value Observing(KVO)和Cocoa Bindings for MonoMac
时间:2022-04-23
本文章向大家介绍Key-Value Coding(KVC),Key-Value Observing(KVO)和Cocoa Bindings for MonoMac,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
Key-Value Coding(KVC)机制允许通过变量名设置(set)以及获取(get)变量值。变量名只是一个字符串,但通常我们称之为Key。KVC也就是Cocoa访问NSObjects的属性的方式而不用直接访问对象的属性。
比如说你有个对象叫做Movie,有三个属性:Title,Producer,Year。
using System;
using System.Collections.Generic;
namespace KVC
{
public partial class Movie
{
public Movie () {}
public string Title { get; set; }
public string Producer { get; set; }
public int Year { get; set; }
}
}
可以直接通过对象Movie的属性访问到:
Movie movie = new Movie();
movie.Title = "Shrek - Forever After"; // to assign the value
var title = movie.Title; // to read the property value
使用KVC可以直接通过NSObject的方法访问到属性的字符串值:
- 设置属性的值SetValueForKey (NSObject value, NSString key)
- 读取属性的值ValueForKey(NSString key)
Movie movie = new Movie();
movie.SetValueForKey((NSString)"Shrek - Forever After",(NSString)"Title");; // to assign the value
var title = movie.ValueForKey((NSString)"Title"); // to read the property
这非常类似于.NET的反射机制
Movie movie = new Movie();
Type sourceType =movie.GetType();
PropertyInfo info = sourceType.GetProperty("Title");
info.SetValue(movie, "Shrek - Forever After" , null); // to assign the value
var title = info.GetValue(this,null)); // to read the property value
只是.NET的反射代码显得有点长河丑陋,使用MonoMac的Cocoa将非常的优雅。
.NET类需要满足Key-Value Coding 编码规范,通过使用[Export("xxxxx")]进行装饰,xxxx就是Cocoa的Key了:
using System;
using System.Collections.Generic;
using MonoMac.Foundation;
namespace KVC
{
public partial class Movie : NSObject
{
public Movie () {}
[Export("title")]
public string Title { get; set; }
[Export("producer")]
public string Producer { get; set; }
[Export("year")]
public int Year { get; set; }
}
}
上面引入了MonoMac.Foundation命名空间,Movie类从NSObject类继承过来,三个属性使用Export属性修饰,这样Movie就可以满足Cocoa的KVC机制。
具体参考文章
http://cocoa-mono.org/archives/153/kvc-kvo-and-cocoa-bindings-oh-my-part-1/
http://tirania.org/monomac/archive/2010/Dec-07.html
- ios tableview 上加 textfiled
- Spring Cloud实战小贴士:Feign的继承特性(伪RPC模式)
- 仿淘宝购买详情页购买缩小动画
- 高仿今日头条(1)
- android Native堆
- Spring Boot中Web应用的统一异常处理
- android bitmap的内存分配和优化
- Gitflow工作流程
- Android学习第一弹:Android通过用代码画虚线椭圆边框背景来学习一下shape的用法
- Spring Boot中使用Swagger2构建强大的RESTful API文档
- iOS iOS与html进行交互
- Android学习第三弹之Android图片颜色处理
- C#Winform使用扩展方法自定义富文本框(RichTextBox)字体颜色
- Android如何实现毛玻璃效果之Android高级模糊技术
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法