我有从UIView继承的GraphicView类。它的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,我向ViewController.xib添加了一个UIView(class = GraphicView)。并且我添加了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];

}

我过得好吗有更好的方法吗?

我不知道如果将GraphicView添加为属性,为什么不调用initWitFrame。

最佳答案

从NIB加载时不调用initWithFrame,而是initWithCoder

如果您可能同时使用了从NIB进行加载和以编程方式进行创建,则应制作一个可以从initCommoninitWithFrame调用的通用方法(也许是initWithCoder?)。

哦,您的init方法未使用推荐的做法:

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

    // ...
}

您应该始终检查[super init...]的返回值。

关于iphone - 如果view是属性,则不执行InitWithFrame,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6356162/

10-09 04:22