2015-08-18 14 views
5

Please help me, Sto personalizzando una classe UIView per impostare il valore NSString come tag, ma come posso ottenere quella vista dalla gerarchia della vista. Nel metodo di visualizzazione della classe UIView per ottenere la vista è viewWithTag:(NSInteger).Posso personalizzare il viewWithTag esistente: (metodo NSInteger) per stringTag?

prega di vedere sotto il codice

#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 

voglio un metodo come viewWithStringTag:(NSString *)stringTag.

Grazie,

risposta

5

Usa ricerca ricorsiva, comprende auto

#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 

Ecco il mio codice di prova

- (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

Grazie, mi permetta di controllare – Vishal16

+0

ritorno non lavoro pari a zero ogni volta. – Vishal16

+0

Funziona bene per il mio progetto di test. Qualcosa di sbagliato? @Vishu –

Problemi correlati