Can I customize an existing viewWithTag: (NSInteger) method for stringTag?

Please help me, I configured the UIView class to set the NSString value as a tag, but how can I get this view from the view hierarchy. There is a viewWithTag:(NSInteger) in the standard method of the UIView class to get the view.

See below code

 #import <UIKit/UIKit.h> @interface UIView (StringTag) @property (nonatomic, copy) NSString *tagString; @end #import "UIView+StringTag.h" #import <objc/runtime.h> static const void *tagKey = &tagKey; @implementation UIView (StringTag) - (void)setTagString:(NSString *)tagString { objc_setAssociatedObject(self, tagKey, tagString,OBJC_ASSOCIATION_COPY_NONATOMIC); } - (id)tagString { return objc_getAssociatedObject(self, tagKey); } @end 

I need a method like viewWithStringTag:(NSString *)stringTag .

Thanks,

+5
source share
1 answer

Use recursive search, enable self

 #import <UIKit/UIKit.h> @interface UIView (StringTag) @property (nonatomic, copy) NSString *tagString; - (UIView *)viewWithStringTag:(NSString *)strTag; @end #import "UIView+StringTag.h" #import <objc/runtime.h> static const void *tagKey = &tagKey; @implementation UIView (StringTag) - (void)setTagString:(NSString *)tagString { objc_setAssociatedObject(self, tagKey, tagString,OBJC_ASSOCIATION_COPY_NONATOMIC); } - (id)tagString { return objc_getAssociatedObject(self, tagKey); } - (UIView *)viewWithStringTag:(NSString *)strTag{ if ([self.tagString isEqual:strTag]){ return self; } if (!self.subviews.count){ return nil; } for (UIView *subview in self.subviews){ UIView *targetView = [subview viewWithStringTag:strTag]; if (targetView){ return targetView; } } return nil; } @end 

Here is my test code

 - (void)viewDidLoad { [super viewDidLoad]; UIView *aView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)]; aView.tagString = @"aView"; UIView *bView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)]; bView.tagString = @"bView"; [self.view addSubview:aView]; [aView addSubview:bView]; UIView *targetView = [self.view viewWithStringTag:@"bView"]; NSLog(@"%@", targetView); // <UIView: 0x7f933bc21e50; frame = (0 0; 100 100); layer = <CALayer: 0x7f933bc1c430>> } 
+5
source

All Articles