Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/113.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 使用NSString值引用UILabel_Objective C_Ios - Fatal编程技术网

Objective c 使用NSString值引用UILabel

Objective c 使用NSString值引用UILabel,objective-c,ios,Objective C,Ios,发发慈悲吧,新手 我有一个动态构造的NSString值,它是UILabel实例的名称。我想向标签发送一条消息以更新其文本。但是,这两种数据类型不匹配。这里有足够的代码(我认为): 在头文件中: IBOutlet UILabel *Clue1; // IBOutlet and IBAction are IDE flags IBOutlet UILabel *Clue2; // IB = interface builder IBOutlet UILabel *Clue3; 在实现文件中: - (I

发发慈悲吧,新手

我有一个动态构造的NSString值,它是UILabel实例的名称。我想向标签发送一条消息以更新其文本。但是,这两种数据类型不匹配。这里有足够的代码(我认为):

在头文件中:

IBOutlet UILabel *Clue1; // IBOutlet and IBAction are IDE flags
IBOutlet UILabel *Clue2; // IB = interface builder
IBOutlet UILabel *Clue3;
在实现文件中:

- (IBAction) newPuzzle:(id)sender { // Clear all fields & get new clue

    [Clue1 setText:@""]; // Clear the fields
    [Clue2 setText:@""]; 
    [Clue3 setText:@""]; 

    // Send up a randomly chosen new clue

    NSArray *clues = [NSArray arrayWithObjects:@"222", @"333", nil];
    NSInteger randomIndex = arc4random()%[clues count];
    NSString *aClue = [clues objectAtIndex:randomIndex];

    // The clue will be split into component digits and each piece sent to a different label

    for (NSInteger charIdx = 0; charIdx < aClue.length; charIdx++) {
        NSString *cluePos = [NSString stringWithFormat:@"Clue%d", charIdx + 1];
        NSLog(@"%@", cluePos); // works
        [cluePos setText:@"test"]; // Xcode notes the type mismatch
    }
}
-(iAction)newPuzzle:(id)发送者{//清除所有字段并获取新线索
[clue1settext:@”“];//清除字段
[Clue2 setText:@”“;
[Clue3 setText:@”“;
//发送随机选择的新线索
NSArray*线索=[NSArray阵列,其对象:@“222”,“333”,无];
NSInteger randomIndex=arc4random()%[线索计数];
NSString*aClue=[线索对象索引:随机索引];
//线索将被分为部件数字,并将每个部件发送到不同的标签
对于(NSInteger charIdx=0;charIdx
在这方面也有一些类似的问题,但没有一个足够接近我,使我认识到它们适用于我的情况,至少据我所知。使用另一种语言(R)的术语,我需要将cluePos类从NSString“强制”到UILabel。我使用的是Xcode 4.2.1和OSX 10.7.2


TIA。

您不能将字符串强制转换为标签,因为它们根本不同。该字符串不了解视图控制器类或其属性(其中一些恰好是标签)

但是,您可以使用valueForKey:方法按名称获取对象的属性,其中名称被指定为字符串。因此,要在我的视图控制器上获得名为Clue1的属性,我会说:

UILabel *label = [self valueForKey:@"Clue1"];
或者在您的情况下,这是:

NSString *cluePos = [NSString stringWithFormat:@"Clue%d", charIdx + 1];
UILabel *label = [self valueForKey:cluePos];
label.text = @"test";
(在本例中,我假设“self”指的是视图控制器,但您可以对任何具有属性的对象调用它。)

另一种方法是使用NSSelectorFromString将字符串转换为选择器。看起来是这样的:

SEL selector = NSSelectorFromString(@"Clue1");
UILabel *label = [self performSelector:selector];
出于您的目的,这两种解决方案都可以很好地工作,但是使用选择器的优点是您可以将参数传递给方法调用(这样您就可以调用返回对象的方法,而不仅仅是访问属性或IBOutlet)

请注意,如果尝试访问属性或调用不存在的方法,这两种方法都会引发异常。在调用该属性之前,您可以测试该属性是否存在,方法是:

SEL selector = NSSelectorFromString(@"Clue1");
BOOL labelExists = [self respondsToSelector:selector];
if (labelExists)
{
    UILabel *label = [self performSelector:selector];
    label.text = @"test";
}
else
{
    //do something else
}

太好了,谢谢,很有效。我需要稍微研究一下valueForKey和properties,以了解替换是如何工作的。我希望文本不是label.text=@“test”,而是一个变量,特别是我希望传递[aClue characterAtIndex:charIdx]作为要显示的值。你能建议怎么做吗?还在学习!谢谢。要获取给定索引处的字符,请尝试[aClue substringWithRange:NSMakeRange(charIdx,1)]。它返回一个一个字符长的字符串,这比unichar更容易使用。谢谢,它的作用就像一个符咒。我要学习更多,但这是我学习最好的方式。再次感谢。