Проблема с несколькими экземплярами одного и того же объекта UIView - PullRequest
0 голосов
/ 07 февраля 2011

У меня проблема с программированием для iOS. Уже искали похожие проблемы, но пока ничего не нашли.

Я создаю как минимум 8 пользовательских UIViews. Как вы можете видеть в прилагаемом коде, я выполняю цикл, создающий один экземпляр за раунд. Ссылка каждого объекта находится в другом месте в памяти, но когда я изменяю значение в одном объекте, это влияет только на объект, который был создан в последнем цикле (последний созданный экземпляр). Есть идеи?

PadView.h:

#import <UIKit/UIKit.h>

@interface PadView : UIView {

}

- (void)setText:(NSString*)text;

@end

PadView.m:

#import "PadView.h"
#import "AVFoundation/AVFoundation.h";

@implementation PadView

AVAudioPlayer *player;
UILabel *label;

- (void)setText:(NSString*)text {

    label.text = text;
}

- (void)initialize {

    label = [[ UILabel alloc ] initWithFrame:CGRectMake(0.0, 93.0, 107.0, 13.0)];
    label.backgroundColor = [UIColor clearColor];
    label.font = [UIFont boldSystemFontOfSize:9];
    label.textAlignment = UITextAlignmentCenter;
    label.text = @"Empty";
    [self addSubview:label];
    [label release];
}

- (id) initWithCoder:(NSCoder *)aCoder {

    if (self = [super initWithCoder:aCoder]) {

        [self initialize];
    }
    return self;
}

- (id) initWithFrame:(CGRect)rect {

    if (self = [super initWithFrame:rect]) {

        [self initialize];
    }
    return self;
}

- (void)dealloc {

    [super dealloc];
}

@end

Создание объектов:

NSMutableArray *pads = [[NSMutableArray alloc] initWithCapacity:8];

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

    PadView *pad = [[PadView alloc] initWithFrame:CGRectMake(0.0, i*150, 107.0, 107.0)];
    [padsView addSubview:pad];
    [pads addObject:pad];
}

Call setText:

PadView *pad = [pads objectAtIndex:5];
[pad setText:@"test"];

Ответы [ 2 ]

2 голосов
/ 07 февраля 2011

Ваши переменные:

AVAudioPlayer *player;
UILabel *label;

определены в блоке @implementation, поэтому они фактически являются глобальными переменными (в смысле C).

Таким образом, в основном все ваши* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Я не знаю, что вам нужно.

Мне не хватает контекста, но кажется, что вы хотите label.вместо этого быть переменной экземпляра (и я бы также предположил player).Если это так, вам нужно объявить их в блоке @interface следующим образом:

@interface PadView : UIView {

    AVAudioPlayer *player;
    UILabel *label;

}

- (void)setText:(NSString*)text;

@end
0 голосов
/ 07 февраля 2011

pads не инициализировано

NSMutableArray *pads = [[NSMutableArray alloc] initWithCapacity:8];

и вы должны освободить pad после добавления в качестве подпредставления и в массив

По соглашению класс должен называться PadView, а не padView

1012 * редактировать *

for(padView *pad in pads){
    //manipulate each pad 
}



//manipulate a certain pad
padView *pad = [pads objectAtIndex:5];
pad. //...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...