• 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中关联方式,简单说一下,很简单,看字面就能理解。第一个是弱引用关联对象,简称弱关联;第二个是(非原子访问)强关联,第三个是(非原子访问)复制对象关联;第四个是强关联,最后一个是复制对象关联;

  • 相关阅读:
    【Java】+Lombok
    【Java】【陷阱】toString() 再也不用了
    【Excel】获取一列的有效行数
    【Excel】同一个表格 不同sheet表之间数据关联
    【Excel】+ 高亮显示当前单元格所在的行与列
    【Java】获取类中所有的方法
    捕获子线程中的异常
    Kafka documentation PDF
    Spring java8 LocalDatetime 格式化
    OneDrive同步文件夹不显示绿色对勾
  • 原文地址:https://www.cnblogs.com/pengoeng/p/8038405.html
Copyright © 2020-2023  润新知