Динамически называть метки в цели c - PullRequest
3 голосов
/ 07 марта 2012

Я новичок в разработке для iOS, только что задал быстрый вопрос.Я создаю приложение с 100 UILabel's.Каждый ярлык пронумерован от 0 до 99. Проблема в том, что я не хочу делать это для всех 100 ярлыков.

output1.text = [[NSString alloc] initWithFormat:@"1"];
output2.text = [[NSString alloc] initWithFormat:@"2"];
.....
output100.text = [[NSString alloc] initWithFormat:@"100"];

Вместо этого я хотел бы сделать это немного более динамично.Ниже я пытаюсь использовать циклы для динамического создания строки.Например, добавив «1.text» в конец «output», я получаю строку «output1.text».

for (int i=0; i< 100; i++) {
    outputNameString = [NSMutableString stringWithCapacity:0];
    [outputNameString setString:@"output"];
    [outputNameString appendString:[NSString stringWithFormat:@"%i.text",i + 1]];
    outputNameString = [[NSString alloc] initWithFormat:@"%@",i];
}

«output1» - «output100» правильно объявлены в разделе интерфейса и правильно синтезированы.Я что-то здесь упускаю или это просто невозможно?Любая помощь будет оценена.

Ответы [ 6 ]

9 голосов
/ 07 марта 2012

когда вы создаете ярлык .. установите их теги из скажем (100 --- 200)

так. инициализируйте ваш ярлык следующим образом ..

 for (int i=0; i< 100; i++) {

UILabel *label = [[UILabel alloc] init] ;
// label formatting code here...

label.tag = i+100;
   }

затем получите вашу метку вот так ... и установите ее текст

for (int i=0; i< 100; i++) {

UILabel *myLabel = (UILabel *)[self.view viewWithTag:i+100]; // get the label with tag
myLabel.text = [NSString stringWithFormat:@" Label %d",i+1"];
}

это должно прекрасно работать .. В чем проблема .?

2 голосов
/ 07 марта 2012

Если у вас есть массив (NSArray) со всеми вашими метками, это решение:

for (int i=0; i< 100; i++) {
    UILabel *label = [arrayOfLabels objectAtIndex:i];
    label.text = [NSString stringWithFormat:@"output.%d.text", i+1];
}


Редактировать: выделение, хранение и доступ к 100 объектам

Я думаю, что лучше иметь все указатели меток в массиве, а не маркировать их, особенно потому, что у вас есть сотня! и каждый раз, когда вы вызываете viewWithTag: метод, он ищет представление, оно не индексируется.

Использование NSArray:

@interface Object : SuperObject {
    NSArray *labels;
}
@end
@implementation
- (void)someMethodThatCreatesLabels {
    labels = [[NSMutableArray alloc] initWithCapacity:100];
    for(NSInteger i = 0; i < 100; i++){
        UILabel *label = [[UILabel alloc] ...];
        label.text = [NSString stringWithFormat:@"output.%d.text", i+1];
        [view addSubview:label]
        [labels addObject:label];
        [label release];
    }
}
- (void)methodThatAccessALabel{
    UILabel *label45 = [labels objectAtIndex:45];
    // Do your thing ...
}
- (void)dealloc{
    [labels release];
    [super dealloc];
}
@end

Использование массивов C, который немного короче (labels[i] вместо [labels objectAtIndex:i])

@interface Object : SuperObject {
    UILabel **labels;
}
@end
@implementation Object
- (void)methodThatCreatesLabels
{
    labels = malloc(100*sizeOf(UILabel *));
    for(NSInteger i = 0; i < 100; i++){
        labels[i] = [[UILabel alloc] ...];
        labels[i].text = [NSString stringWithFormat:@"output.%d.text", i+1];
        [view addSubview:labels[i]]
    }
}
- (void)methodThatAccessALabel{
    UILabel *label45 = labels[45];
    // Do your thing ...
}
- (void)dealloc{
    for(int i = 0; i<100; i++) [labels[i] release];
    free(labels);
    [super dealloc];
}
1 голос
/ 07 марта 2012

Способ получения переменных с именами "переменных" - это массивы.

Вы можете сделать одно из двух:

UILabel *output[100];
for(NSInteger i = 0; i < 100; i++){
  output[i] = [[UILabel alloc] ...];
}

Это объявит массив из 100 меток от 0 до 99, и вы можете получить к ним доступ следующим образом:

[output[50] setText:text];

Другой способ:

NSMutableArray *outputLabels = [[NSMutableArray alloc] initWithCapacity:100];
for(NSInteger i = 0; i < 100; i++){
  UILabel *label = [[UILabel alloc] ...];
  [outputLabels addObject:label];
}

И получить к ним доступ так:

[[outputLabels objectAtIndex:50] setText:text];

В общем, вы должны прочитать о массивах C, а затем прочитать документацию о NSArray и NSMutableArray.

0 голосов
/ 26 апреля 2012

Я могу немного опоздать на шоу здесь.Я не совсем уверен, если вы хотите назвать имя Uilabels или установить свойство текста Uilabels?из вашего примера кода похоже, что вы пытаетесь установить текст, учитывая, что вы уже сказали, что синтезировали их.если это так, я могу назвать эту мелодию одной строкой, боб!KVC (кодирование ключ-значение) я думаю, что если ваша лучшая ставка ...

for (int i=1; i< 101; i++)
{
    [self setValue:[NSString stringWithFormat:@"%i", i] forKeyPath:[NSString stringWithFormat:@"output%i.text", i]];
} 

конечный результат будет выглядеть так ...

output1.text = @"1";
// repeat...
output100.text = @"100";

, если вы хотите установитьтеги, с которыми вы могли бы сделать то же самое с ...

for (int i=1; i< 101; i++)
    {
        [self setValue:i forKeyPath:[NSString stringWithFormat:@"output%i.tag", i]];
    } 

, конечный результат был бы похож на выполнение этого ...

output1.tag = 1;
// repeat...
output100.tag = 100;

конечно, вы можете поместить обе процедуры в одну и ту жедля цикла, если вы хотели.если это то, что вам нужно, я бы порекомендовал изменить ваш код на это.это, безусловно, самый эффективный и «яблочный» способ сделать это.Вы можете изменить ситуацию и настроить ее так, как вы хотите, чтобы внести любые динамические изменения, которые вы хотите.это очень крутой метод.он урезал почти 500 строк кода в одном из моих проектов, как только я понял это.Удивительно, что вы узнаете, когда вы на самом деле читаете документы.

0 голосов
/ 07 марта 2012

Когда вы говорите: «Каждый ярлык пронумерован от 0 до 99», вы имеете в виду, что они имеют эти теги, верно? Если да, начните свои теги с 1 до 100, а не с 0 до 99 Если нет, установите теги для каждой метки. (Если вы не знаете, что такое теги, прочитайте о свойстве tag в UIView документации )

Затем вы можете легко получить доступ к этим меткам в цикле:

for(int i = 1; i <= 100; i++)
{
    [[self.view viewWithTag:i] setText:[NSString stringWithFormat:@"Output%d.text",i]];
}

Если вы еще не создали все метки в представлении, я бы предложил создать метки программно, в цикле и установить теги. Поскольку вы можете легко получить к ним доступ с помощью тегов, вам также не нужно объявлять их как свойства.

0 голосов
/ 07 марта 2012

В iOS вы можете управлять представлениями, помечая их. Таким образом, для вашей цели вы можете создать базовый вид, по этому вы добавите все метки с соответствующими тегами. Позже, когда вам понадобится конкретная метка, просто запросите метод viewWithTag.

Вот как вы можете это реализовать:

Создание меток:

UIView *baseView = [[UIView alloc] init];
//keep its reference for later use.. you will need to make it instance variable if you want to access labels in other than this method.

for(int i=0;i<100;i++)
{
   UILabel *label = [[UILabel alloc] init];
   label.tag = i+1; //we are offsetting its value by 1 because tag=0 is for the baseview itself.
   label.text = <the text you wish to assign>;
   [baseView addSubview:label];
   [label release]; //if you are not using ARC.
   label = nil;
}

Доступ к ярлыкам:

UILabel *label = (UILabel *)[baseView viewWithTag:<provide the tag value you wish to access>];

Для получения дополнительной информации о тегировании UIView вы можете обратиться к документации .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...