2

总的来说,我对编程相当陌生,并且一直在关注 iTunesU 上的 CS193p 视频。我目前正在执行任务 3,并且无法从发送到视图控制器的视图中获取一些信息。

我相信我已经正确设置了整个委托,所以问题实际上是如何让我的 View Controller 看到一些信息(例如self.bounds.size.width),这是只有 View 才有的属性。这会涉及使用self.dataSource吗?如果是这样,我可以通过什么方式传递这些信息?我的最终目标是让 View Controller 对 View 的属性进行一些转换,然后将其发送回 ViewdrawRect以便绘制。

谢谢!!

** 根据要求编辑,我在下面发布了我的 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... :(
4

2 回答 2

1

阅读了 CS193p 作业 3(对于任何感兴趣的人,可以在此处以 PDF 格式获得),看起来您被要求为您的 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);
于 2012-10-04T15:36:18.927 回答
0

我对分配不熟悉,但如果您在视图控制器中使用视图,则可以像这样访问该视图属性:

 SomeView *someView = [SomeView new];

 CGFloat width = someView.bounds.size.width;
于 2012-10-04T15:38:34.920 回答