2017-06-20 7 views
1

私はプログラムでラベルを作成しています。残念ながら、私はラベルを更新するたびに新しいインスタンスを作成していることを発見しました。作成する前にUILabelが既に存在するかどうかを確認する方法はありますか?IOS/Objective-C:レイジーロードUILabel

これは、ラベルを作成するために、私の現在のコードです:

UILabel *percentLabel = [[UILabel alloc] initWithFrame:CGRectMake(20, height, 280, 20)]; 

私は次のようにそれを調整した場合、私はそれはラベルを認識しないというエラーが表示されます。任意の提案のための

for (id percentLabel in self.view.subviews) { 
     if (![percentLabel isKindOfClass:[UILabel class]]) { 
      UILabel *percentLabel = [[UILabel alloc] initWithFrame:CGRectMake(20, height, 280, 20)]; 
     } 
    percentLabel.textAlignment = NSTextAlignmentCenter; 

感謝を。

+0

あなたはこのコードをどこに置いていますか? – AdamPro13

+0

今は、%を計算するためにさまざまなことを行う独自の方法です。パーセントを変更するものを変更すると、このメソッドが呼び出されます。 – user6631314

+0

self.viewにサブビューがない場合、ループに入ることなくUILabelが作成され、self.viewにUILabelsではないいくつかのサブビューがある場合、新しいUILabelsが作成され、使用されません。なぜならif条件が存在すると、ラベルインスタンスが解放され、アプリケーションがtextAlignmentプロパティを持たない他のタイプのビューでtextAlignmentを見つけようとしているときにクラッシュするからです(つまり、今あなたのコードで何が起こっているのか)。 self.viewにUILabelビューがある場合は、テキストを揃えます。 – abintom

答えて

1

は、オブジェクトの存在を確認するための多くの方法があります

は、メソッドを作成します。あなたの例では、ifステートメントは、forサイクルの1回の繰り返しごとにラベルを作成します。そのコードの修正版は、次のようになります。それは、以下のように私はあなたのビューコントローラでのプロパティとしてそのラベルを保存し、遅延し、それを初期化するために、あなたをお勧めしますしかし

UILabel *percentLabel = nil; 
for (id subview in self.view.subviews) { 
    if ([subview isKindOfClass:[UILabel class]]) { 
    percentLabel = (UILabel *)subview; 
    break; 
    } 
} 
if (!percentLabel) { 
    // Label creation code here 
} 

... 
@property (weak, nonatomic) UILabel *percentLabel; 
... 

- (UILabel *)percentLabel { 
    if (!_percentLabel) { 
    UILabel *percentLabel = /* initialization code here */; 
    // Add percent label as a subview to your view 
    _percentLabel = percentLabel; 
    } 

    return _percentLabel; 
} 

あなたのビューは実際にそのラベルを所有し、それを介して強い参照を保持するので、私は弱い参照でプロパティを保存していることに注意してください。subviewsプロパティ。

+0

私は、一度このラベルを初期化するというこのアプローチによって、ロードされた後、ここに示されているようなプロパティにそれを格納することができました。次に、データの変更に合わせてlabel.textプロパティのパーセント値を更新します。 – user6631314

1

あなたのサブビュー(実際にはラベルではない場合があります)をループしているように見え、テキストの配置を変更しようとしています。

などのように、クラスのプロパティを設定するなど、その後のサブビューの上に毎回ループラベルインスタンスを追跡するためのより良い方法、あります:あなたの.hファイルでのごインターフェースdeclerationに

UILabel *labelToChange; 

が。

は、その後、あなたの実装では、単にあなただけ [UILabel alloc] init一度あなたが percentLabelユニーク tag値を与えることができます UILabel

+0

今、私はそのyの起点(高さ)の変数でラベルを初期化しています。たぶん私はちょうどその起源の任意の値でラベルを初期化し、その後、それを変更する必要があります。しかし、私は怠け者alloc initを行う方法があると期待していた – user6631314

+0

残念なことに、あなたがフレームで使用した変数の値を変更するだけでは、ラベルのフレームを変更することはありません。移動したい場合は、ラベルを完全に新しいフレームに明示的に渡す必要があります。 –

0

のインスタンスを初期化するために念の

labelToChange.textAlignment = NSTextAlignmentCenter; 

を使用してラベルにアクセスします。

あなたは

UILabel *percentLabel = [[UILabel alloc] initWithFrame:CGRectMake(20, height, 280, 20)]; 
percentLabel.tag = 100; 
[self.view addSubview:percentLabel]; 

//In another method 
UILabel *percenLabel = [self.view viewWithTag:100]; 
if (percentLabel == nil) { 
    percentLabel = [[UILabel alloc] initWithFrame:CGRectMake(20, height, 280, 20)]; 
    percentLabel.tag = 100; 
    percentLabel.textAlignment = NSTextAlignmentCenter; 
    [self.view addSubview:percentLabel]; 
} 
else { 
    percentLabel.textAlignment = NSTextAlignmentCenter; 
} 
1

のようにあなたのUILabelにクラスをチェックする必要はありません。そのように独自のタグを設定することが容易になるだろう、percentLabelを取得するためにviewWithTagを使用することができます。 UITableView、UINavigationBarなどにもUILabelがあることを覚えておいてください。あなたはそれらを混乱させたくありません。

したがって、ラベルを作成してviewDidLoad ONCEで呼び出すメソッドと、ラベルを更新するメソッドの2つのメソッドを作成する必要があります。

-(void)createLabels { 
    UILabel *percentLabel = [[UILabel alloc] initWithFrame:CGRectMake(20, height, 280, 20)]; 
    percentLabel.tag = 1111; // a unique tag 
    [self.view addSubview:percentLabel]; 
} 

アップデート方法:

-(void)updateLabelWithText:(NSString*)newText { 
    UILabel *yourLabel = (UILabel*)[self.view viewWithTag:1111]; 
    yourLabel.text = newText; 
} 
関連する問題