我有从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进行加载和以编程方式进行创建,则应制作一个可以从initCommon
和initWithFrame
调用的通用方法(也许是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/