我对编程很新,并且一直关注iTunesU上的CS193p视频。我目前正在执行作业3,并且无法从发送到View Controller的View中获取一些信息。
我相信我已经正确地设置了整个委托的事情,所以问题实际上是如何让我的View Controller看到一些信息(例如self.bounds.size.width
),这是一个只有查看了。这会涉及使用self.dataSource
吗?如果是这样,我可以通过什么方式传递这些信息?我的最终目标是让View Controller对View的属性执行一些转换,然后将其发送回View drawRect
,以便绘制它。
谢谢!
**编辑,根据要求,我已经发布了部分drawRect代码
- (void)drawRect:(CGRect)rect
{
CGContextRef context = UIGraphicsGetCurrentContext();
CGFloat scale = 32;
CGPoint midPoint;
midPoint.x = self.bounds.origin.x + self.bounds.size.width/2;
midPoint.y = self.bounds.origin.y + self.bounds.size.height/2;
// ---- finding the y starting point
float totalXsInWidth;
totalXsInWidth = self.bounds.size.width / scale;
float leftMostX = totalXsInWidth / -2;
float graphResultY = sin(leftMostX); // ** in theory, I want "leftMostX" to be modifed by the equation entered (in the CONTROLLER)
NSLog(@"The leftMostX is %f", leftMostX);
[self.dataSource passingVariable:leftMostX]; //** Here I pass the variable from drawRect to get modifyed in the CONTROLLER
float graphResultY1;
graphResultY1 = 5; //this is a test, I want to see if the controller actually effect a change
graphResultY1 = [self.dataSource calcResult:self]; //this should now be a different number than 5 or 0 (the init value)
NSLog(@"From graphingview, the result is %f", graphResultY1); //** unfortunately = 0... :(
答案 0 :(得分:1)
读过CS193p作业3(for anyone interested, it is available here in PDF format)后,看起来你被要求为你的UIView子类创建一个协议,并拥有该协议的委托(视图的管理视图控制器)提供用于绘图的数据。
如果您已正确设置协议,则视图的drawRect
方法应通过协议的方法向视图控制器询问数据,如:
DataObject *data = [self.delegate getData];
// It might be [self.dataSource getData]; in your case
那应该调用你应该写入视图控制器的getData
委托方法(我为此编写了一个方法签名,适应你的协议所使用的方法。此外,这段代码没有如果需要,请考虑相关的内存管理):
- (DataObject *)getData
{
// Get data from the model, and return
DataObject *dataObjectToReturn = [Model getRelevantData];
return dataObjectToReturn;
}
视图的drawRect
现在应该具有DataObject
的相关实例,并且可以继续使用该数据来绘制需要绘制的内容。
以下是我的原始答案,它与上面的具体问题无关,但确实显示了另一种视图/视图控制器交互方法。 (此方法不适用于上述问题,因为绘图所需的数据不应归视图本身所有。)
要从该视图的控制器访问视图的属性,您可以使用self.view
。因此,要获得视图的宽度,就像在您的示例中一样,您将使用:
CGFloat viewWidth = self.view.bounds.size.width;
您也可以设置控制器的视图,但请注意,对于您的示例,您必须为框架提供整个CGRect,因为不允许直接操纵宽度:
// This gets a reference to the view's frame, then uses values from it to create a new
// CGRect that is 10.0 points wider, and sets the frame of the view to the new frame
CGRect viewFrame = self.view.frame;
self.view.frame = CGRectMake(viewFrame.origin.x, viewFrame.origin.y, viewFrame.size.width + 10.0f, viewFrame.size.height);
答案 1 :(得分:0)
我不熟悉该任务,但如果您在视图控制器中使用视图,则可以访问该视图属性,如下所示:
SomeView *someView = [SomeView new];
CGFloat width = someView.bounds.size.width;