5

UIView クラスをカスタマイズして NSString 値をタグとして設定していますが、ビュー階層からそのビューを取得するにはどうすればよいですか。UIView クラスでは、ビューを取得するデフォルトの方法はviewWithTag:(NSInteger).

以下のコードをご覧ください

#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

のようなメソッドが欲しいですviewWithStringTag:(NSString *)stringTag

ありがとう、

4

1 に答える 1

5

再帰検索を使用し、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

ここに私のテストコードがあります

- (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>>
}
于 2015-08-18T11:48:36.807 に答える