iOS - Хранение групп UILabels в NSMutableArray - PullRequest
0 голосов
/ 18 июля 2011

Я создаю UILabel s динамически в каждом цикле.Каждый цикл, который выполняется, создает 1-4 UILabels.

Я хочу, чтобы я поместил эти UILabels в свой NSMutableArray и смог позже легко получить данные.

Моя первоначальная мысль былапоместите эти UILabels в NSDictionary и используйте [dictGroupLabels setValue:uiLabel1 forKey:@"uiLabel1"], а затем [dictGroupLabels setValue:uiLabel2 forKey:@"uiLabel2"] и так далее.И затем поместите этот словарь в мой NSMutableArray для каждого цикла.Позже я мог получить доступ к таким значениям, как UILabel *label = [[myArray objectAtIndex:0] valueForKey:@"uiLabel1"] НО , которые, к сожалению, не работают, поскольку UILabels не соответствуют протоколу NSCopying.

Итак, как вы решите эту проблему?это?

Ответы [ 2 ]

2 голосов
/ 18 июля 2011

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

Для иллюстрации дано следующее гипотетическое определение класса:

@interface MyClass: NSObject { 
    NSMutableDictionary * _labelDict; 
} 

@property (nonatomic, retain) NSMutableDictionary * labelDict; 

- ( void )methodA; 
- ( void )methodB; 
- (NSMutableDictionary *) labelsForRunLoop: (NSUInteger) loopIdx;
@end

У вас будет следующая гипотетическая реализация класса:

@implementation MyClass 

@synthesize labelDict = _labelDict; 

- ( id ) init { 
    if( ( self = [ super init ] ) ) { 
        [self setLabelDict: [NSMutableDictionary dictionaryWithCapacity: 8]]; 
    } 
} 

- ( void ) dealloc  { 
    [ self.labelDict release ]; 
    [ super dealloc ]; 
} 

- ( void ) methodA {
    for(NSUInteger i = 0; i < some index; i++) {
        [self.labelDict setObject: [self labelsForRunLoop: i] forKey: [NSString stringWithFormat: @"%d", i]];
    }
} 

- ( void ) methodB { 
    // Locate the label you need to work with. Example based on this crude pseudo code
    NSMutableDictionary * subDict = (NSMutableDictionary *) [self.labelDict objectForKey: @"0"];
    UILabel * theLabel = (UILabel * ) [subDict objectForKey: @"UILabel.Z"]; 
    theLabel.text = @"Label 1"; 
} 

- (NSMutableDictionary *) labelsForRunLoop: (NSUInteger) loopIdx {
    NSMutableDictionary * dictionary = [NSMutableDictionary dictionaryWithCapacity: 4] ;
    [dictionary setObject: create-w-label forKey: @"UILabel.W"];
    [dictionary setObject: create-x-label forKey: @"UILabel.X"];
    [dictionary setObject: create-y-label forKey: @"UILabel.Y"];
    [dictionary setObject: create-z-label forKey: @"UILabel.Z"];

    return [dictionary retain];
}

@end

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

1 голос
/ 18 июля 2011

Им не нужно придерживаться NSCopying для добавления в массив.Похоже, вам просто нужно сделать что-то вроде этого:

NSMutableArray *mainArray = [NSMutableArray array];

for(int i = 0; i < 5; i++)
{
    NSMutableArray *subArray = [[NSMutableArray alloc] initWithCapacity:5];

    for(int j = 0; j < 4; j++)
    {
        UILabel *label = [[UILabel alloc] init];
        // etc.
        [subArray addObject:label];
        [label release];
    }
    [mainArray addObject:subArray];
    [subArray release];
}

// then, to get one of the labels:

UILabel *someSpecificLabel = [[mainArray objectAtIndex:2] objectAtIndex:1];
...