iOSでUIButtonにruntimeを介して応答メソッドにパラメータを渡す
本稿ではruntimeによってbutton関連オブジェクトに与えられ,buttonへの応答方法伝達パラメータを実現することに重点を置いて説明する.
我々はaddTarget:action:forControlEvents:メソッドを使用してUIButtonに応答イベントを追加します.
btnTouchedは応答方法である.
それでは問題が来て、この方法btnTouchedにパラメータを伝えたいのはどのように実現しますか?
1.最も基本的な伝参
これで整数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)
直接コード:
この例では、NSIndexPathオブジェクトが渡されます.
簡単です.over!
我々は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!