iOS開發(fā) 利用關(guān)聯(lián)對象(RunTime)為控件命名

前言

最近公司項目有類游戲答題的要求, 選對的題目, 答案和動畫不一樣, 但是界面是用for循環(huán)做的, 這樣就得提取相應答案按鈕對應的其他控件來換圖片或者換動畫, 一共十幾個題型, 用tag記錄實在是太蛋疼就直接用關(guān)聯(lián)對象給控件命名了, 記起來也方便.


關(guān)聯(lián)對象介紹

之前的文章


實現(xiàn)

這樣給系統(tǒng)控件添加方法, 一般就是用分類, 所以用分類來實現(xiàn)類似view.tag的功能.

新建一個UIView+YNViewName的類目

聲明文件:

#import <UIKit/UIKit.h>

@interface UIView (YNViewName)

- (UIView *)yn_viewNamed:(NSString *)name;

@property (copy, nonatomic) NSString *yn_viewName;

@end

實現(xiàn)文件:

記得先引用#import <objc/runtime.h>, 關(guān)聯(lián)對象也是在runtime基礎(chǔ)上做文章.

#import "UIView+YNViewName.h"
#import <objc/runtime.h>

static const void *YNViewNameKey = @"YNViewName";

@implementation UIView (YNViewName)

- (void)setYn_viewName:(NSString *)yn_viewName {
    objc_setAssociatedObject(self, YNViewNameKey, yn_viewName, OBJC_ASSOCIATION_COPY_NONATOMIC);;
}

- (NSString *)yn_viewName {
    return objc_getAssociatedObject(self, YNViewNameKey);
}

- (UIView *)yn_viewNamed:(NSString *)name {
    
    if (!name) {
        return nil;
    }
    
    return [self viewWithName:name];
}

- (UIView *)viewWithName:(NSString *)aName {
    
    if (!aName) {
        return nil;
    }
    
    if ([self.yn_viewName isEqualToString:aName]) {
        return self;
    }
    
    // 子視圖遞歸
    for (UIView *subview in self.subviews) {
        UIView *theView = [subview yn_viewNamed:aName];
        if (theView) {
            return theView;
            break;
        }
    }
    
    return nil;
}

@end

用法

SB或者XIB

使用SB或者XIB, 可以不聲明對象, 這種做法好與不好不做討論. 詳見demo.

SB或者XIB

代碼

- (void)viewDidLoad {
    [super viewDidLoad];
    
    UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(100, 400, 50, 25)];
    imageView.backgroundColor = [UIColor blackColor];
    imageView.yn_viewName = imageViewName;
    [self.view addSubview:imageView];
    
    UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];
    button.frame = CGRectMake(100, 450, 50, 25);
    button.backgroundColor = [UIColor greenColor];
    [button addTarget:self action:@selector(changeColor) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button];
}

- (void)changeColor {
    UIImageView *imageView = (UIImageView *)[self.view yn_viewNamed:imageViewName];
    imageView.backgroundColor = [UIColor grayColor];
}


Demo

Demo地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末申钩,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子唐全,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件港粱,死亡現(xiàn)場離奇詭異隔盛,居然都是意外死亡,警方通過查閱死者的電腦和手機朗儒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門颊乘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人醉锄,你說我怎么就攤上這事乏悄。” “怎么了恳不?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵檩小,是天一觀的道長。 經(jīng)常有香客問我烟勋,道長识啦,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任神妹,我火速辦了婚禮颓哮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鸵荠。我一直安慰自己冕茅,他們只是感情好,可當我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布蛹找。 她就那樣靜靜地躺著姨伤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪庸疾。 梳的紋絲不亂的頭發(fā)上乍楚,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天,我揣著相機與錄音届慈,去河邊找鬼徒溪。 笑死,一個胖子當著我的面吹牛金顿,可吹牛的內(nèi)容都是我干的臊泌。 我是一名探鬼主播,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼揍拆,長吁一口氣:“原來是場噩夢啊……” “哼渠概!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起嫂拴,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤播揪,失蹤者是張志新(化名)和其女友劉穎贮喧,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體猪狈,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡塞淹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了罪裹。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡运挫,死狀恐怖状共,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情谁帕,我是刑警寧澤峡继,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站匈挖,受9級特大地震影響碾牌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜儡循,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一舶吗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧择膝,春花似錦誓琼、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至齿穗,卻和暖如春傲隶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背窃页。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工跺株, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人脖卖。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓帖鸦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親胚嘲。 傳聞我的和親對象是個殘疾皇子作儿,可洞房花燭夜當晚...
    茶點故事閱讀 44,969評論 2 355

推薦閱讀更多精彩內(nèi)容