0

複数のボタンと対応するラベルを持つアプリケーションを作成しています。レイアウトは、以下のコードを含むクラスに接続されている nib (.xib) ファイルにあります。多くの余分なコードが作成されるため、すべてのラベルに IBOutlet を使用しないようにしています。

タグを使用してラベルを参照する方法があることは知っています。

UILabel *countLabel = (UILabel *)[self.view viewWithTag:numOfTag];

これを buttonPressed メソッド内で呼び出しました。ただし、テキストを変更しようとすると

[countLabel setText:@"newLabel"];

アプリがクラッシュします。アクセス方法が間違っていますか?私は XCode が初めてです..ヘルプ!

ありがとう :)

4

2 に答える 2

0

これは正しい方法ではありません。まず、XIB ファイルで UILabel を作成するときはいつでも、そこに名前を付けることができるので、技術的にのみ、接続されたビュー コントローラーでラベル値を設定する必要はありません。第 2 に、後の段階でラベルをリセットしたい場合でも、IBOutlets を使用してラベルを接続するのが最善の策です。すべてのサブビューをスキャンしてから、タグ付きの特定のサブビューを見つけるのは面倒なので、この場合は避けるべきです。

編集:

50 個を超えるボタンとラベルを作成する必要がある場合は、UIButton と UILabel を含むカスタム UIView を作成することをお勧めします。そして、それらを表示したいビューで、 for ループでオブジェクトを作成して表示します。また、UIButton がタップされると、カスタム UIView オブジェクトを介して関連する UILabel を簡単に取得できます。

于 2013-11-11T04:12:38.470 に答える
0

あなたのラベルは で見つからないはずなviewWithTag:ので、nil になります。また、nil コントロールのプロパティにアクセスしようとすると、クラッシュする可能性があります。

ラベルが nil でないかどうかを確認し、それがラベルであるかどうかを確認します

if(countLabel != nil && [countLabel isKindOfClass:[UILabel class]])
    [countLabel setText:@"newLabel"];
else
    NSLog(@"countLabel is not found");

viewWithTag:tag パラメータの値と一致するタグ プロパティを持つレシーバーの階層内のビューを検索します。これは、階層内のタグに遭遇する最初のコントロールを返します。したがって、タグがビュー全体で非常に一意である必要があることを確認してください。の代わりに Label の直接の親を指定していることを確認してくださいself.view

編集:

問題を追跡できない場合にも、この方法を試すことができます。

for (UIView *child in self.view.subviews) {
    if([child isKindOfClass:[UILabel class]] && [child tag] == numOfTag)
    {
        [child setText:@"newLabel"];
        break;
    }
}
于 2013-11-11T04:06:23.967 に答える