zoukankan      html  css  js  c++  java
  • iOS UIButton 传递多个参数

    今天项目中遇到这样一个情况,一个tableView的cell上有一个button,button的触发事件我需要知道当前button所在cell的一些值和上次点击的cell的一些值,那么怎么把这些值和当前这个button绑定呢,OC提供了一个关联对象的方法,

    objc_setAssociatedObject(id _Nonnull object, const void * _Nonnull key,
                             id _Nullable value, objc_AssociationPolicy policy)

     这是设置关联对象,第一个参数是要和谁关联的对象,例如button,第二个是key值,第三个是关联的对象,也就是你要绑定在button上的参数,最后一个是关联方式。

    /** 
     * Returns the value associated with a given object for a given key.
     * 
     * @param object The source object for the association.
     * @param key The key for the association.
     * 
     * @return The value associated with the key e key for e object.
     * 
     * @see objc_setAssociatedObject
     */
    OBJC_EXPORT id _Nullable
    objc_getAssociatedObject(id _Nonnull object, const void * _Nonnull key)
        OBJC_AVAILABLE(10.6, 3.1, 9.0, 1.0, 2.0);

    这是获取关联对象的方法。第一个参数是绑定的对象,第二个是key值。这样就能传递多个参数。下面是例子:

    cell.selectBtn.tag = indexPath.row;
        objc_setAssociatedObject(cell.selectBtn, @"index", indexPath,OBJC_ASSOCIATION_RETAIN_NONATOMIC);
        objc_setAssociatedObject(cell.selectBtn, @"cell", cell,OBJC_ASSOCIATION_RETAIN_NONATOMIC);
        objc_setAssociatedObject(cell.selectBtn, @"table", tableView, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
        [cell.selectBtn addTarget:self action:@selector(defaultButtonClick:) forControlEvents:UIControlEventTouchUpInside];

    我给button绑定了三个参数,一个indexpath,一个cell,一个tableView。

    下面是获取这三参数的方法:

    -(void)defaultButtonClick:(UIButton *)btn{
        
        NSIndexPath * indexPath = objc_getAssociatedObject(btn, @"index");
        MyCarTableViewCell *cell = objc_getAssociatedObject(btn, @"cell");
        DLog(@"======%ld=====%@",(long)indexPath.row,cell.defaultLab.text);
        UITableView *table = objc_getAssociatedObject(btn, @"table");
    }

    是不是感觉OC也是很强大的。

    OBJC_ASSOCIATION_ASSIGN = 0,           /**< Specifies a weak reference to the associated object. */
        OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1, /**< Specifies a strong reference to the associated object. 
                                                *   The association is not made atomically. */
        OBJC_ASSOCIATION_COPY_NONATOMIC = 3,   /**< Specifies that the associated object is copied. 
                                                *   The association is not made atomically. */
        OBJC_ASSOCIATION_RETAIN = 01401,       /**< Specifies a strong reference to the associated object.
                                                *   The association is made atomically. */
        OBJC_ASSOCIATION_COPY = 01403          /**< Specifies that the associated object is copied.

    这是关联的5中关联方式,简单说一下,很简单,看字面就能理解。第一个是弱引用关联对象,简称弱关联;第二个是(非原子访问)强关联,第三个是(非原子访问)复制对象关联;第四个是强关联,最后一个是复制对象关联;

  • 相关阅读:
    SQL Server 创建用户自定义数据类型
    用输入法敲打键盘时字体之间的间隔突然变大了,是怎么回事?
    SQL Server 增加自增ID列
    Python安装cv2模块不成功
    Python错误20009:pymssql._pymssql.OperationalError) (20009, b'DB-Lib error message 20009, severity 9: Unable to connect: Adaptive Server is unavailable or does not exist ')
    Python 获取父级目录
    谷歌上网助手Ghelper
    Python连接MySQL数据库
    Python用pandas获取Excel数据
    Python连接MySQL数据库获取数据绘制柱状图
  • 原文地址:https://www.cnblogs.com/pengoeng/p/8038405.html
Copyright © 2011-2022 走看看