如何将选择器(SEL)与objc_setAssociatedObject一起使用?

时间:2016-04-20 19:34:20

标签: objective-c runtime associated-object

我可以使用带有objc_setAssociatedObject的SEL类型参数而不将其转换为NSString类型吗?

目前我正在使用此代码: objc_setAssociatedObject(thirdPartyObject, &kSelectorKey, NSStringFromSelector(selector), OBJC_ASSOCIATION_RETAIN);

转换为NSString有效,但感觉不对。必须有更合适的解决方案。

2 个答案:

答案 0 :(得分:0)

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

第3个参数需要是对象类型。所以,是的,你需要转换。

答案 1 :(得分:0)

试试这个。
在我的例子中,我已经通过indexpath你必须用你的参数替换

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    yourCustomeCell *aCell;
    NSString *aStrIdentifier = @"yourIdentiFier";
    aCell = (yourCustomeCell *)[tableView dequeueReusableCellWithIdentifier:aStrIdentifier];

    //you have to set your indexpath
    objc_setAssociatedObject(aCell.btnUpload_or_Add, @"objBtn", indexPath, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    [aCell.YourButton addTarget:self action:@selector(yourButtonActiontapped:) forControlEvents:UIControlEventTouchUpInside];

    return aCell;
}

-(IBAction)yourButtonActiontapped:(UIButton *)sender{

    NSIndexPath *aIndPath =  objc_getAssociatedObject(sender, @"objBtn");
    NSLog(@"row:%@",aIndPath.row);
}
  

您还必须导入#import <objc/runtime.h>