IOS Runtime属性关联实现表格编辑文本

要实现在表格里编辑文本, 表格让我想到了CollectionView,文本让我想起TextView, 做之前想了好久怎么样来获得编辑的是哪个TextView,要获取对应的IndexPath啊,想着之前Cell中的按钮用block来实现,在自定义的Cell中加一个属性存IndexPath,可想着就一个TextView要自定义写一个类这样也未免太麻烦了。正好突然想到之前听过的属性管理,自己就凑着这个机会用了下,赶脚还不错。

有时候类的实例可能是某种机制所创建,而开发者无法令这种机制创建出自己所写的子类实例。

可以给某对象关联许多其他对象。这些对象会通过“键”来区分。

存储对象值的时候,可以指明“存储策略”,用以维护相应的“内存管理语义”。

存储策略由名为objc_AssociationPolicy 的枚举定义。

如果关联对象成了属性,那么它就会具备对应的语义。

关联类型 等效的@property属性
OBJC_ASSOCIATION_ASSIGN ASSIGN
OBJC_ASSOCIATION_RETAIN_NONATOMIC nonatomic,retain
OBJC_ASSOCIATION_COPY_NONATOMIC nonatomic,copy
OBJC_ASSOCIATION_RETAIN retain
OBJC_ASSOCIATION_COPY copy

以下方法用来管理关联对象:

① void objc_setAssociatedObject(id object, void *key, id value, objc_AssociationPolicy policy);

此方法以给定的键和策略为某对象设置关联对象值。

② void objc_getAssociatedObject(id object, void *key);

此方法根据给定的键从某对象中获取相应的关联对象值。

③ void objc_removeAssociatedObjects(id object);

此方法移除指定对象的全部关联对象。

4. 设置关联对象用的键是个“不透明的指针”,即所指向的数据结构不局限于某种特定类型的指针。

再设置关联对象值时,若想令两个键匹配到同一个值,则二者必须时完全相同的指针才行。

跟NSDictionary不一样。NSDictionary认为“isEqual:”返回YES,则二者相同。

故设置关联对象值时,通常使用静态全局变量做键。

代码:

#import "ViewController.h"

//属性关联属于动态运行时
#import <objc/runtime.h>
//设置key
const static NSString *key=@"indexPath";

@interface ViewController ()<UICollectionViewDataSource,UICollectionViewDelegate,UICollectionViewDelegateFlowLayout,UITextViewDelegate>
{
    CGFloat _imgHeight;
    UICollectionView *_mCollectionView;
}

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    [self.view addSubview:[self createCollectionView]];

}

//create CollectionView
- (UICollectionView *)createCollectionView
{
//    UICollectionViewDelegateFlowLayout
    UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
    _imgHeight = (self.view.frame.size.width - 50)/4;
    layout.itemSize = CGSizeMake((self.view.frame.size.width - 50)/4, 30);
    layout.minimumLineSpacing = 10;
    layout.minimumInteritemSpacing = 10;
    layout.sectionInset = UIEdgeInsetsMake(10, 10, 10, 10);

    _mCollectionView = [[UICollectionView alloc] initWithFrame:self.view.bounds collectionViewLayout:layout ];

    _mCollectionView.delegate = self;
    _mCollectionView.dataSource = self;
    _mCollectionView.backgroundColor = [UIColor whiteColor];
    [_mCollectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"Cell"];
    return _mCollectionView;
}

//UICollectionViewDataSource,UICollectionViewDelegate
- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
{
    return 2;
}

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
    if (section==0) {
        return 10;
    }
    return 20;
}

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"%@",indexPath);
}
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{

    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath];
    UITextView *textView=[[UITextView alloc]initWithFrame:CGRectMake(0, 0, _imgHeight,30)];
    textView.layer.borderWidth=2;
    textView.layer.borderColor=[UIColor redColor].CGColor;
    [cell.contentView addSubview:textView];

    //属性关联  设置
    objc_setAssociatedObject(textView, key.UTF8String, indexPath , OBJC_ASSOCIATION_RETAIN);
    textView.delegate=self;

    return cell;
}

//UITextViewDelegate
- (void)textViewDidEndEditing:(UITextView *)textView
{

    //属性关联  获取
    NSIndexPath *indexPath=objc_getAssociatedObject(textView, key.UTF8String);
    NSLog(@"%@",indexPath);

}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

时间: 2024-10-05 06:32:10

IOS Runtime属性关联实现表格编辑文本的相关文章

iOS runtime实战应用:关联对象

在开始之前建议先阅读iOS runtime的基础理解篇:iOS内功篇:runtime 有筒子在面试的时候,遇到这样一个问题:"如何給NSArray添加一个属性(不能使用继承)",筒子立马蒙逼了,不能用继承,难道用分类?但是分类貌似只能添加方法不能添加属性啊,筒子百思不得其解,直到后来接触到了runtime才恍然大悟. 什么是关联对象 关联对象是指某个OC对象通过一个唯一的key连接到一个类的实例上.举个例子:xiaoming是Person类的一个实例,他的dog(一个OC对象)通过一根

iOS runtime探究(四): 从runtiem开始实践Category添加属性与黑魔法method swizzling

你要知道的runtime都在这里 转载请注明出处 http://blog.csdn.net/u014205968/article/details/67639335 本文主要讲解runtime相关知识,从原理到实践,由于包含内容过多分为以下五篇文章详细讲解,可自行选择需要了解的方向: 从runtime开始: 理解面向对象的类到面向过程的结构体 从runtime开始: 深入理解OC消息转发机制 从runtime开始: 理解OC的属性property 从runtime开始: 实践Category添加属

Xamarin iOS教程之显示和编辑文本

Xamarin iOS教程之显示和编辑文本 Xamarin iOS显示和编辑文本 在一个应用程序中,文字是非常重要的.它就是这些不会说话的设备的嘴巴.通过这些文字,可以很清楚的指定这些应用程序要表达的信息.以下将为开发者介绍3种关于文本的视图. Xamarin iOS标签视图 标签视图(一般使用UILabel类实现)一般用于在应用程序中为用户显示少量的信息. [示例2-13]以下就是通过标签视图为开发者显示一首诗的效果.具体步骤如下: (1)创建一个Single View Application

iOS runtime 关联对象(Associated Object)

?需求 同一个类有多个alertView, 不同的alertView 点击确定按钮 执行的方法不同 alertOne 点击 确定按钮 执行 methodOne, alertTwo 点击确定按钮 执行 methodTwo 常规做法 初始化并显示 alertOne - (IBAction)showAlertOne:(id)sender {     UIAlertView *alertOne = [[UIAlertView alloc]initWithTitle:@"AlertOne" me

iOS 9应用开发教程之编辑界面与编写代码

iOS 9应用开发教程之编辑界面与编写代码 编辑界面 在1.2.2小节中提到过编辑界面(Interface builder),编辑界面是用来设计用户界面的,单击打开Main.storyboard文件就打开了编辑界面.在Xcode 5.0以后中,编辑界面直接使用的是故事板.本小节将对编辑界面进行介绍 1.界面的构成 单击Main.storyboard打开编辑界面后,可以看到编辑界面会有4部分组成,如图1.23所示. 编号为1的部分为dock. 编号为2的部分为画布:用于设计用户界面的地方,在画布中

IOS TextField属性

原文请链接:http://blog.csdn.net/tskyfree/article/details/8121915/ //初始化textfield并设置位置及大小 UITextField *text = [[UITextField alloc]initWithFrame:CGRectMake(20, 20, 130, 30)]; //设置边框样式,只有设置了才会显示边框样式 text.borderStyle = UITextBorderStyleRoundedRect; typedef en

Flask学习记录之MarkDown编辑文本

为了让网页支持markdown编辑文本,使用如下了4个库 PageDown : 在前端提供一个可以实时将markdown内容转换成html文本进行效果预览的编辑器 Flask-PageDown: 这个库将PageDown集成到Flask-Wtf库中,更方便使用 MarkDown: 将MarkDown标记文本转换为Html文本 Bleach: 基于白名单清除Html文本中不安全的标签 PageDown的使用 和其他类库相识,需要初始化 from flask.ext.pagedown import

iOS 字符属性NSAttributedString描述

/* 字符属性 字符属性可以应用于 attributed string 的文本中. NSString *const NSFontAttributeName;(字体) NSString *const NSParagraphStyleAttributeName;(段落) NSString *const NSForegroundColorAttributeName;(字体颜色) NSString *const NSBackgroundColorAttributeName;(字体背景色) NSStrin

【UWP通用应用开发】编辑文本、绘制图形、3D透视效果及绘制时钟实战

编辑文本及键盘输入 相信大家都会使用TextBox,但如果要让文本在TextBox中换行该怎么做呢?将TextWrapping属性设置为Wrap,将AcceptsReturn属性设置为True就好咯. PasswordBox很明显就是一个密码框了,和其他的控件相比其有2个特殊之处,一个是其可以用MaxLength来控制最大的长度,一个是用PasswordChanged来捕捉密码的改名.显然比如QQ密码的MaxLength就是16位了,而PasswordChanged可以用来监测比如用户设置的密码