iOSでUIButtonにruntimeを介して応答メソッドにパラメータを渡す


本稿ではruntimeによってbutton関連オブジェクトに与えられ,buttonへの応答方法伝達パラメータを実現することに重点を置いて説明する.
我々はaddTarget:action:forControlEvents:メソッドを使用してUIButtonに応答イベントを追加します.
[btn addTarget:self action:@selector(btnTouhced:) forControlEvents:UIControlEventTouchUpInside];

btnTouchedは応答方法である.
それでは問題が来て、この方法btnTouchedにパラメータを伝えたいのはどのように実現しますか?
1.最も基本的な伝参
- (void)initButton
{
    UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 30, 20)];
    btn.tag = 10;
    [btn addTarget:self action:@selector(btnTouhced:) forControlEvents:UIControlEventTouchUpInside];
    [self addSubview:btn];
}

- (void)btnTouhced:(UIButton *)btn
{
    NSLog(@"%d",btn.tag);
}

これで整数10を渡すことができます.
しかし、パスしたいパラメータがオブジェクトであればどうしますか?例えばNSString.前述の伝参形式では要求を満たすことができない.
次にruntimeメカニズムを利用してパラメータを実現する方法を紹介します.runtime関連原理を知る必要がなく、使用することができます.runtime関連付けの原理については、OC-関連付けを参照してください.
runtime関連の3つの方法について説明します.
関連付けの作成
objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)
関連付けの取得
objc_getAssociatedObject(id object, const void *key)
関連付け解除
objc_removeAssociatedObjects(id object)
直接コード:
- (void)installTickButtonOnCell:(ZLPhotoPickerCollectionViewCell *)cell
                        AtIndex:(NSIndexPath *)indexPath
{
    UIButton *tickButton = [[UIButton alloc] init];
    tickButton.frame = CGRectMake(cell.frame.size.width - 28, 5, 21, 21);
    [tickButton setBackgroundColor:[UIColor clearColor]];
    //runtime     
    objc_setAssociatedObject(tickButton, @"tickBtn", indexPath, OBJC_ASSOCIATION_ASSIGN);
    [tickButton addTarget:self action:@selector(tickBtnTouhced:) forControlEvents:UIControlEventTouchUpInside];
    [cell.contentView addSubview:tickButton];
}
- (void)tickBtnTouhced:(UIButton *)btn
{
    //runtime        
    NSIndexPath * indexPath = objc_getAssociatedObject(btn, @"tickBtn");
    NSLog(@"tickBtnTouhced----%d",indexPath.item);
}

この例では、NSIndexPathオブジェクトが渡されます.
簡単です.over!