![](/img/trans.png)
[英]iPhone SDK: Download and Set UIImageView before first view controller is displayed
[英]Method in View Controller Called before View initialized - iPhone iOS 5 SDK
由于某种原因,永远不会调用属性的自定义设置器。 因此,它总是在运行时为零。
我有一个视图控制器,它创建一个NSValue对象的NSArray并将其作为属性传递给视图。 但是,即使我使用调试器确认视图控制器中的NSArray正常,该属性也始终为nil。
视图控制器 @interface GraphingViewController()@属性(非原子,弱)IBOutlet GraphingView * graphingView; @结束
- (void) determinePointsOnGraph
{
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
NSMutableArray *pointsForGraph = [[NSMutableArray alloc] init];
float startingPoint = -250;
for (int i = 0; i < 500; i++) {
float x = startingPoint;
startingPoint++;
[dict setValue:[NSNumber numberWithFloat:x] forKey:[NSString stringWithString:@"x"]];
float y = [CalculatorBrain runProgram:[self graph] usingVariableValues:dict];
[pointsForGraph addObject:[NSValue valueWithCGPoint:CGPointMake(x,y)]];
}
//This calls the pointer to the view, and the setter for the view's property
[self.graphingView setPointsOnGraph:pointsForGraph];
}
视图
@synthesize pointsOnGraph = _pointsOnGraph;
- (void)setPointsOnGraph:(NSArray *)pointsOnGraph
{
//Custom setter for property, never gets called if a break point is put here
_pointsOnGraph = pointsOnGraph;
[self setNeedsDisplay];
}
- (void)drawLine:(NSArray *)pointsOfLine inContext:(CGContextRef)context
{
CGPoint pointsOfLineAsCGPoints[[pointsOfLine count]];
for (int i = 0; i < sizeof(pointsOfLineAsCGPoints); i++) {
pointsOfLineAsCGPoints[i] = [[pointsOfLine objectAtIndex:i] CGPointValue];
}
CGContextAddLines(context, pointsOfLineAsCGPoints, sizeof(pointsOfLine));
CGContextClosePath(context);
CGContextStrokePath(context);
}
drawLine方法由drawRect调用,并将pointsOnGraph属性作为pointsOfLine传递。 即使我在drawRect中放置一个断点并查看pointsOnGraph属性,它在视图中也始终为零。 但是,当视图控制器将其传递给视图时,它包含数百个对象。
我只是不明白为什么该属性始终为零,如果我在设置器中放置一个断点,它将永远不会被调用。
更新我已经验证了第一次调用该视图时,该视图的faceView引用为nil,但IBOutlet似乎已正确连接,该视图最终得到显示。 似乎在self.graphingView IBOutlet初始化之前就调用了视图控制器方法
以下是我从中选择的View Controller
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if([segue.identifier isEqualToString:@"Graphing"] ) {
[segue.destinationViewController setGraph:[[self.brain program] mutableCopy]];
[segue.destinationViewController determinePointsOnGraph];
}
}
解决方案在viewDidLoad委托中而不是在准备segue时调用definePointsOnGraph方法。 这样可以确保已创建视图。 我还遇到另一个问题,这是因为在视图设置器中未初始化视图访问视图控制器中数据的出口。
调用setter之前,请确保self.graphingView不为nil
在视图委托方法viewDidLoad中调用图上的确定点
似乎您在初始化self.graphingView之前太早发送消息-(void)setPointsOnGraph:(NSArray *)pointsOnGraph 。
我建议您发送消息-(无效) GraphingViewController的viewWillAppear中的definePointsOnGraph。 这是因为在设置NSArray pointsOnGraph之前,应该对self.graphingView进行初始化(应在调用-viewDidLoad时完成)。
为了确认我的建议是否可行,请添加您对此GraphingViewController的实现,尤其是调用消息的部分-(void)definePointsOnGraph 。
供您参考,当我对视图和方法的顺序感到困惑时,我在viewDidAppear,viewDidLoad,drawRect和viewWillAppear中输入了NSLogs以阐明正在发生的事情。 序列应为viewDidLoad-> viewWillAppear-> drawRect-> viewDidAppear 。
另一方面,如果您的代码正常运行,则graphingView中的setter方法将泄漏内存。 在将_pointsOnGraph设置为给定指针之前,需要释放它。 例如,您可以按以下方式实现它:
- (void)setPointsOnGraph:(NSArray *)pointsOnGraph
{
[_pointsOnGraph release];
_pointsOnGraph = pointsOnGraph;
[self setNeedsDisplay];
}
另外,在发送消息之前,应自动释放NSArray,例如:
[self.graphingView setPointsOnGraph:[pointsForGraph autorelease]];
但更好的是,您可以通过不分配NSMutableArray来减少代码和括号的数量。 这可以通过更改来完成
NSMutableArray *pointsForGraph = [[NSMutableArray alloc] init];
至
NSMutableArray *pointsForGraph = [NSMutableArray dictionary];
忘了自动发布。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.