2017-07-13 1 views
0

私のアプリケーションで同じクラスのすべてのオブジェクト(UIView)にUILabelを隠そうとしています。私は静的なクラスメソッドで何かを試みたが、私はインスタンス変数にアクセスすることができません。同じクラスのすべてのオブジェクトで何かを隠す

MyView.h

@interface MyView: UIView 
{ 
    UILabel *titleLabel; 
    UILabel *subTitleLabel; 
} 

+(void)hideLabel; 

@end 

MyView.m

#import "MyView.h" 

@implementation TempNodeView 

    +(void)hideLabel 
    { 
     [titleLabel setHidden:YES]; 
    } 

@end 

このような状況で最高の(適切な)解決策は何ですか?

ありがとうございました

+0

だけ見るからすべてのラベルを取得&それを隠そう!下のリンクを確認してください。ここからすべてのテキストフィールドを表示する例ですが、UITextFieldをUILabelに置き換えることができます - https://stackoverflow.com/questions/40908471/how-to-get-all-the-textfields-from-a- view-in-swift –

+0

クラスのすべてのインスタンスに対して、それらのインスタンスへの参照を持たずに動作する魔法の方法はありません。あなたのクラスインスタンスがNSNotificationを観察し、その通知がポストされたときにラベルを隠すことができます。 – Paulw11

+0

しかし、複数のラベルがあり、1種類のラベルだけを隠したいのですが? –

答えて

1

あなたの場合は、このすべてのオブジェクトへの参照を持つことをお勧めします。つまり、コンストラクタ内の静的配列にオブジェクトを追加する必要があります。

問題は、その後、あなたがメモリリークを避けるように、あなたのオブジェクトへの弱参照のコンテナになります別のオブジェクトを必要とするので、ビューは、アレイによって保持されることが起こります。

は、次のようなものを構築するために試してみてください。

static NSMutableArray *__containersPool = nil; 

@interface MyViewContainer : NSObject 
@property (nonatomic, weak) MyView *view; 
@end 

@implementation MyViewContainer 
@end 

@interface MyView : UIView 
@property (nonatomic, readonly) UILabel *labelToHide; 
@end 

@implementation MyView 

+ (NSMutableArray *)containersPool { 
    if(__containersPool == nil) { 
     __containersPool = [[NSMutableArray alloc] init]; 
    } 
    return __containersPool; 
} 

// TODO: override other constructors as well 
- (instancetype)initWithFrame:(CGRect)frame { 
    if((self = [super initWithFrame:frame])) { 
     MyViewContainer *container = [[MyViewContainer alloc] init]; 
     container.view = self; 
     [[MyView containersPool] addObject:container]; 
    } 
    return self; 
} 

+ (void)setAllLabelsHidden:(BOOL)hidden { 
    for(MyViewContainer *container in [[self containersPool] copy]) { 
     if(container.view == nil) { 
      [[self containersPool] removeObject:container]; // It has been released so remove the container as well 
     } 
     else { 
      container.view.labelToHide.hidden = hidden; 
     } 
    } 
} 

@end 
関連する問題