InitWithFrame не выполняется, если представление является свойством - PullRequest
2 голосов
/ 15 июня 2011

У меня есть класс GraphicView, который наследует от UIView.Его метод initWithFrame:

@implementation GraphicsView

- (id)initWithFrame:(CGRect)frameRect
{
    self = [super initWithFrame:frameRect];

    // Create a ball 2D object in the upper left corner of the screen
    // heading down and right
    ball = [[Object2D alloc] init];
    ball.position = [[Point2D alloc] initWithX:0.0 Y:0.0];
    ball.vector = [[Vector2D alloc] initWithX:5.0 Y:4.0];

    // Start a timer that will call the tick method of this class
    // 30 times per second
    timer = [NSTimer scheduledTimerWithTimeInterval:(1.0/30.0)
                                             target:self
                                           selector:@selector(tick)
                                           userInfo:nil
                                            repeats:YES];

    return self;
}

Используя Interface Builder, я добавил UIView (class = GraphicView) в ViewController.xib.И я добавил GraphicView как свойство:

@interface VoiceTest01ViewController : UIViewController {

    IBOutlet GraphicsView *graphView;
}

@property (nonatomic, retain) IBOutlet GraphicsView *graphView;

- (IBAction)btnStartClicked:(id)sender;
- (IBAction)btnDrawTriangleClicked:(id)sender;

@end

Но с этим кодом не работает, мне нужно вызвать [graphView initWithFrame:graphView.frame], чтобы он заработал.

- (void)viewDidLoad {
    [super viewDidLoad];
    isListening = NO;
    aleatoryValue = 10.0f;

    // Esto es necesario para inicializar la vista
    [graphView initWithFrame:graphView.frame];

}

У меня все хорошо?Есть ли лучший способ сделать это?

Я не знаю, почему initWitFrame не вызывается, если я добавляю GraphicView в качестве свойства.

1 Ответ

3 голосов
/ 15 июня 2011

initWithFrame не вызывается при загрузке из NIB, вместо этого initWithCoder.

Если вы можете использовать как загрузку из NIB, так и программное создание, вы должны сделать общий метод (initCommon возможно?), что бы вы звонили с initWithFrame и initWithCoder.


О, и ваш метод инициализации не использует рекомендуемые практики:

- (id)initWithFrame:(CGRect)frameRect
{
    if (!(self = [super initWithFrame:frameRect]))
        return nil;

    // ...
}

Вывсегда следует проверять возвращаемое значение [super init...].

...