0

次のコードを確認してください。

@property (weak, nonatomic) UILabel *l112;
@property (weak, nonatomic) UILabel *l212:
@property (weak, nonatomic) UILabel *l312:

((RBScorecardVC *)self.presentingViewController).l112.text = @"Hello"
((RBScorecardVC *)self.presentingViewController).l212.text = @"Hello"
((RBScorecardVC *)self.presentingViewController).l312.text = @"Hello"

ラベルのすべてのテキストを「Hello」に設定していることに注目してください。これを行うには、より効率的な方法が必要です。どういうわけかUIlabelsの名前(l112、1212など)にアクセスできることを望んでいます。これは意味がありますか?私の実際のアプリでは、すべてを「こんにちは」に設定しているわけではありませんが、代わりにテキストは計算の結果です。また、実際のアプリでは、設定するラベルが3つ以上あります(50以上あります)。繰り返しifステートメントを使用して各UILabelに個別にアクセスする実際のコードは次のとおりです。

-(IBAction) submitScore: (id)sender
{
self.stringID = ((RBScorecardVC *)self.presentingViewController).self.giveString;

if (self.stringID isEqualToString:@"l112")
{ ((RBScorecardVC *)self.presentingViewController).l112.text = [[NSString alloc]initWithFormat:@"%d", self.accumulator];} //l112 is the name of my UILabel
else if (self.stringID is EqualToString:@"l212")
{ ((RBScorecardVC *)self.presentingViewController).l212.text = [[NSString alloc]initWithFormat:@"%d", self.accumulator];} //l212 is the name of my UILabel
}

私はこのようにもっと効率的にそれをできるようにしたいと思っています:

-(IBAction) submitScore: (id)sender
 self.stringID = ((RBScorecardVC *)self.presentingViewController).self.giveString;

 ((RBScorecardVC *)self.presentingViewController).[UILabel withTitle:@"%@",stringID].text = [[NSString alloc]initWithFormat:@"%d", self.accumulator];}

[UILabel withTitle:@ "%@"、stringID]の部分がドット表記で使用されていることに注意してください。これが機能しないことはわかっていますが、stringIDを使用して必要なUILabelの名前にアクセスできるように、これを正しく書き込むにはどうすればよいでしょうか。

4

4 に答える 4

5

valueForKey:UILabelで使用してみてください。

ただし、より適切な解決策は、これらのプロパティをNSDictionaryに格納することです。

于 2013-02-07T23:01:59.620 に答える
0

このようなことはおそらくあなたが求めていることをするでしょうが、私はNSDictionaryを使用した答えがおそらくより維持可能であることに同意します。または、IBのラベルでinteger tagプロパティを使用して、親ビューのviewWithTag:メソッドを呼び出すこともできます。

- (UILabel *)labelWithName:(NSString *)name
{
    SEL selector = NSSelectorFromString(name);
    if (![self respondsToSelector:selector])
        return nil;

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
    id result = [self performSelector:selector];
#pragma clang diagnostic pop
    if (!result)
        return nil;
    if (![result isKindOfClass:[UILabel class]])
        return nil;
    return (UILabel *)result;
}

- (IBAction)derp:(id)sender
{
    UILabel *label = [self labelWithName:@"label1"];
    [label setText:@"I'm label 1"];
    label = [self labelWithName:@"label2"];
    [label setText:@"I'm label 2"];
}
于 2013-02-07T23:20:18.793 に答える
0

ドット表記(元々はオブジェクト@propertiesを対象としていた)を他の何かに使用したいのはなぜですか?

ドット表記とメソッド表記を参照してください

あなたはObjective-C構文に混乱しているようです:なぜ[UILabel withTitle:"%@", stringId]単純[UILabel withTitle:stringID]ではなく、またはstringIdが文字列でない場合、[UILabel withTitle:[NSString stringWithFormat:@"%@", stringID]]

また、なぜあなたのインスタンスメソッドではなくwithTitleクラスメソッドがオンになっているのですか?UILabelpresentingViewController

于 2013-02-07T23:06:17.603 に答える
0

ここでの他の答えは、オブジェクトのプロパティを扱います。この場合、オブジェクト自体にアクセスしようとしています。このような質問を始めるときは、すべてのオブジェクト(この場合はラベル)を、各ラベルの個々のプロパティではなく、配列プロパティに格納する必要があります。ラベルをl112のような名前付き変数として考える/参照するのではなく、配列内のインデックスとして考えてください。

UILabel * theLabelINeed = [self.myArray objectAtIndex:2]; [theLabelINeed callWhateverMethodINeedTo];

または、Python / Rubyのバックグラウンドを使用していて、これが読みやすい場合は、次のようになります。

[self.myArray [2] callWhateverMethodINeedTo];

また、配列内のすべてのラベルにすばやくアクセスする必要がある場合は、forループで高速列挙を使用できます。

for (UILabel *currLabel in self.myArray) {
    [currLabel callWhateverMethodINeedTo];
}

NSDictionary代わりに、オブジェクトに「キー」または名前を割り当てることができる代わりに使用することもできます。

NSDictionary *dict {"l112": label1, "l113": label2}; // or some other dictionary creation method, maybe a mutable dictionary or whatever.
UILabel *myLabel = [dict objectForKey:@"l112"];
于 2013-02-07T23:26:18.763 に答える