2012-10-04 3 views
2

나는 일반적으로 프로그래밍에 익숙하지 않으며 iTunesU에서 CS193p 비디오를 따라 왔습니다. 현재 과제 3을 수행하고 있으며 View Controller로 보낸 View에서 약간의 정보를 얻는 데 문제가 있습니다.iOS - VIEW에서 컨트롤러로 정보를 전달하는 방법은 무엇입니까?

저는 전체 위임을 올바르게 설정했다고 생각합니다. 따라서보기가 실제로보기에만있는 속성 인 약간의 정보 (예 : self.bounds.size.width)를 보는 방법이 문제입니다. 이것은 self.dataSource을 사용합니까? 그렇다면 어떤 수단을 통해이 정보를 전달할 수 있습니까? 나의 마지막 목표는 뷰 컨트롤러가 뷰의 속성에 대한 일부 변환을 수행하고 그 뷰를 뷰의 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

수 DUPL을 [CS193p 과제 3 - VIEW에서 View Controller로 정보를 전달하는 방법?] (http : // stackoverflow.co.kr/questions/12719329/cs193p-assignment-3-how-to-passing-info-from-view-controller) – kiamlaluno

답변

1

아래에있는 내의 drawRect 코드의

의 요청에 따라 ** 편집, 내가 게시 한 부분이 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); 
+0

~ 너무 빨리 입력하고 응답 해 주셔서 감사합니다. 이 문제를 해결하기 위해 노력했지만 문제는 뷰에서 얻을 수있는 정보를 ** View Controller **로 전달하는 것입니다. 그런 다음 몇 가지 변환 (예 :'viewWidth + 1 ',보기로 다시 전달하기 전에 – zallanx

+0

위에서 게시 한 코드는보기 속성 조작을 수행 할 수있는보기 제어기 인보기 제어기에서 사용됩니다.보기 제어기에서보기 *를 효과적으로 조작 할 수 있습니다 .. –

+0

감사합니다. 아직도 이해가 안되는 점은 일단이 정보를 가지고 뷰 컨트롤러에서 몇 가지 유형의 변환을 수행하면 정보를 View의 'drawRect'로 가져와 적절한 변환이 그려 지도록 표시하는 것입니다 감사합니다 – zallanx

0

임없는 과제로 famaliar하지만보기 컨트롤러 내에서보기를 사용하는 경우 당신과 같이 그 뷰의 속성에 액세스 할 수 있습니다 :

SomeView *someView = [SomeView new]; 

CGFloat width = someView.bounds.size.width; 
+0

좋은 생각이있어. 감사. – zallanx