iOS -- 通過runtime向Button的點選方法裡傳遞引數實現單選效果
阿新 • • 發佈:2019-01-29
效果:
有三個button點選其中一個將其他兩個的選中狀態取消,相當於單選的效果:
由於三個不同是同一型別的按鈕,如果點選三個按鈕都呼叫一個方法將會避免我們的程式碼重複,提高工作效率。那麼要實現這樣的程式碼效果我們就必須在點選方法裡邊將另外兩個button的狀態改變,並且點選的button不確定,其他的button也是不能確定的,這就需要我們在點選button呼叫點選方法的時候將另外兩個button作為引數傳到點選方法中去,
實現方法:
現在來分享一種傳遞的方法:
首先引入標頭檔案#import <objc/runtime.h>
運用以下兩個方法存取物件
本物件 對應的標識 需要關聯的物件 關聯型別
objc_setAssociatedObject(<#id object#>, <#const void *key#>, <#id value#>, <#objc_AssociationPolicy policy#>) //這是關聯方法
本物件 對應的標識
objc_getAssociatedObject(<#id object#>, <#const void *key#>) //這是取出關聯物件的方法
程式碼示例:
//初始化三個button SelectButton *inAndOutsideSelectBtn = [[SelectButton alloc]initWithSelected:YES Title:@"內包裝-外包裝"]; [self addSelectButtonWithSelectButton:inAndOutsideSelectBtn Count:0]; SelectButton *outsideSelectBtn = [[SelectButton alloc]initWithSelected:NO Title:@"物品-外包裝"]; [self addSelectButtonWithSelectButton:outsideSelectBtn Count:1]; SelectButton *insideSelectBtn = [[SelectButton alloc]initWithSelected:NO Title:@"物品-內包裝"]; [self addSelectButtonWithSelectButton:insideSelectBtn Count:2]; ///新增點選方法 [inAndOutsideSelectBtn addTarget:self action:@selector(selectBaozhuangButtonDidClicked:) forControlEvents:UIControlEventTouchUpInside]; ///關聯另外兩個按鈕 objc_setAssociatedObject(inAndOutsideSelectBtn, @"firstOtherButton", outsideSelectBtn, OBJC_ASSOCIATION_RETAIN_NONATOMIC); objc_setAssociatedObject(inAndOutsideSelectBtn, @"secondOtherButton", insideSelectBtn, OBJC_ASSOCIATION_RETAIN_NONATOMIC); ///第二個按鈕新增點選方法 [outsideSelectBtn addTarget:self action:@selector(selectBaozhuangButtonDidClicked:) forControlEvents:UIControlEventTouchUpInside]; ///關聯另外兩個按鈕 objc_setAssociatedObject(outsideSelectBtn, @"firstOtherButton", inAndOutsideSelectBtn, OBJC_ASSOCIATION_RETAIN_NONATOMIC); objc_setAssociatedObject(outsideSelectBtn, @"secondOtherButton", insideSelectBtn, OBJC_ASSOCIATION_RETAIN_NONATOMIC); ///第三個按鈕新增點選方法 [insideSelectBtn addTarget:self action:@selector(selectBaozhuangButtonDidClicked:) forControlEvents:UIControlEventTouchUpInside]; ///關聯另外兩個按鈕 objc_setAssociatedObject(insideSelectBtn, @"firstOtherButton", inAndOutsideSelectBtn, OBJC_ASSOCIATION_RETAIN_NONATOMIC); objc_setAssociatedObject(insideSelectBtn, @"secondOtherButton", outsideSelectBtn, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
button的點選方法 ,將點選之後button應該有的狀態通過定義是block傳到自定義button的初始化方法裡邊包含的block程式碼塊中做相應的操作。
#pragma mark -- 選擇包裝模式button點選方法
- (void)selectBaozhuangButtonDidClicked:(SelectButton *)sender{
SelectButton *firstBtn = objc_getAssociatedObject(sender, @"firstOtherButton");
SelectButton *seconBtn = objc_getAssociatedObject(sender, @"secondOtherButton");
if (sender.isSlected == NO){
//運用block將button點選後應該顯示的狀態傳過去
sender.clicedBlock(YES);
firstBtn.clicedBlock(NO);
seconBtn.clicedBlock(NO);
}
}
自定義button的.h檔案
#import <UIKit/UIKit.h>
typedef void(^CLICDEDBLOCK)(BOOL isSelected);
@interface SelectButton : UIButton
///是否被選中的標誌
@property(nonatomic,assign)BOOL isSlected;
@property(nonatomic,copy)CLICDEDBLOCK clicedBlock;
#pragma mark -- 重寫初始化方法
- (instancetype)initWithSelected:(BOOL)isSlected Title:(NSString *)title;
@end
自定義button的.m檔案
#import "SelectButton.h"
@implementation SelectButton
///初始化的時候選擇是否被選中
- (instancetype)initWithSelected:(BOOL)isSlected Title:(NSString *)title
{
self = [super init];
if (self) {
self.backgroundColor = RGBCOLOR(227, 221, 198);
[self.titleLabel setFont:TEXT_FONT];
[self setTitle:title forState:UIControlStateNormal];
_isSlected = isSlected;
if (_isSlected == YES) {
//如果需要選中狀態
[self setBackgroundImage:[UIImage imageNamed:@"selected_btn_bg"] forState:UIControlStateNormal];
}else{
//如果需要不選中狀態
[self setBackgroundImage:nil forState:UIControlStateNormal];
[self setTitleColor:RGBCOLOR(63, 183, 158) forState:UIControlStateNormal];
}
//此block外部點選時會呼叫做出相應的改變
__weak __typeof(self) ws = self;
self.clicedBlock = ^(BOOL isSelect){
if (isSelect == YES) {
//改變button的狀態
ws.isSlected = YES;
[ws setBackgroundImage:[UIImage imageNamed:@"selected_btn_bg"] forState:UIControlStateNormal];
[ws setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
}else{
ws.isSlected = NO;
[ws setBackgroundImage:nil forState:UIControlStateNormal];
[ws setTitleColor:RGBCOLOR(63, 183, 158) forState:UIControlStateNormal];
}
};
}
return self;
}
@end
關聯兩個button是這樣,依次類推可以關聯多個物件,以實現單選效果。