iOS - 如何将信息从VIEW传递到Controller?

时间:2012-10-04 15:22:30

标签: ios cocoa-touch cs193p

我对编程很新,并且一直关注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... :(

2 个答案:

答案 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;