2015-08-18 8 views
5

Lütfen bana yardım edin, NSString değerini bir etiket olarak ayarlamak için UIView sınıfını özelleştirdim, ancak bu görünümü hiyerarşiden nasıl görüntüleyebilirim.Görüntü almak için UIView sınıf varsayılan yöntem viewWithTag:(NSInteger). Mevcut viewWithTag: stringTag için (NSInteger) yöntemini özelleştirebilir miyim?

Ben viewWithStringTag:(NSString *)stringTag gibi bir yöntem istediğiniz kod

#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 

lütfen aşağıya bakın.

sayesinde

cevap

5

kullanın özyinelemeli arama, öz

#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 
İşte

olan benim test kodu

- (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>> 
} 
+0

Teşekkür içerir, beni her zaman nil – Vishal16

+0

çalışmıyor dönüşünü kontrol edelim. – Vishal16

+0

Test projemde iyi çalışıyor. Herşey yanlış? @Vishu –