2012-02-01 7 views
0

나는 AddQuoteViewController를 호출하는 RootViewController를 가지고 있는데, AddQuoteViewController에 나타나지 않는 RootViewController에서 설정 한 변수 "subject_id"가 있으며 그 이유를 이해하는 데 도움이 필요합니다. 그것을 고치는 법.하나의 ViewController에서 다른 ViewController로 객체를 전달하는 방법

Subject *sub = [self.tableDataSource objectAtIndex:indexPath.row]; 

    self.subject_id = sub.subject_id; 

    [self addQuote_Clicked: sub]; 

은 ...

- (void) addQuote_Clicked:(id)sender { 

    if(aqvController == nil) 
     aqvController = [[AddQuoteViewController alloc] initWithNibName:@"AddQuoteView" bundle:nil]; 

    if(addNavigationController == nil) 
     addNavigationController = [[UINavigationController alloc] initWithRootViewController:aqvController]; 

    [self.navigationController presentModalViewController:addNavigationController animated:YES]; 
} 

그런 다음 내 AddQuoteViewController에서 나는 다음과 같이이 변수에 액세스하려고 :

RootViewController *rv = [RootViewController alloc] ; 

NSLog(@"rv.Subject_id = %d", rv.subject_id); 

그러나 아무것도 얻을 수 없다. 이것을하기위한 간단한 방법이 있어야합니다.

+0

가능한 복제본 [한 ViewController에서 다른 ViewController로 개체에 액세스하는 방법] (http://stackoverflow.com/questions/704524/how-to-access-objects-from-one-viewcontroller-to-another-viewcontroller)). 이것은 * 매우 * 자주 묻는 질문입니다. 여기에 링크되어있는 질문이 당신이 찾고있는 것과 정확히 일치하지 않는다면, 계속 살펴보십시오.이 테마에 대한 많은 변형이 있습니다. – Caleb

+0

Caleb에게 감사 드려라. 그러나 나는보고있는 약간의 시간을 보내었고, 내가 다른 지위에 여기에서 줬던 명백한 방향을 발견하지 않았다. – jroyce

답변

1

가이 일을 여러 가지 방법이 있지만, 짧은 대답은 - 당신은 당신의 AddQuoteViewController에 속성으로 RootViewController에 대한 참조를 설정할 수 있습니다 AddQuoteViewController.h

에서

RootViewController *rvc 

...

@property (nonatomic,assign) RootViewController *rvc; 

및 대응하는 g 구현 클래스에서 합성 및 해제.

- (void) addQuote_Clicked:(id)sender { 

    if(aqvController == nil) 
     aqvController = [[AddQuoteViewController alloc] initWithNibName:@"AddQuoteView" bundle:nil]; 
    aqvController.rvc = self; 
... etc. 

그런 다음이 속성을 통해 AddQuoteViewController 내부의 루트 뷰 컨트롤러의 속성에 액세스 할 수 있습니다 : 당신이 당신의 RootViewController 내부에 AddQuoteViewController를 만들 때 (AddQuoteViewController.m)

그런 다음,이 속성을 설정

새 메모를 할당하여 객체에 대한 참조를 얻으려고 시도하는 것과 같은 질문에 약간의 일들이 있습니다. 또한 새 탐색 공동을 만듭니다. 컨트롤러를 모달 뷰 컨트롤러로 제시하면 일반적으로 하나 또는 다른 작업을 수행하게됩니다 (새 탐색 컨트롤러를 만들 필요가 없습니다). 즉,보기 컨트롤러를 만들고 모달로 표시하거나보기 컨트롤러를 만들어 현재 탐색 컨트롤러 스택에 밀어 넣습니다.

+1

이것이 순환 참조가되지 않겠는가? 그것은 메모리 관리에 약간의 복잡성을 더할 수 있습니다 만, 아직 ARC에 익숙하지는 않지만 여기에서 사용되는 것은 ARC입니다. –

+0

이 방향에 대해 감사드립니다. 내 코드가 약간 난폭 한 것임을 알았습니다. 문자 그대로 발을 찾고 그 주위에서 어수선하기 때문입니다. – jroyce

+0

Mr. Jefferson - 좋은 지적 - aqvc는 rootvc의 구성원이기 때문에 릴리스 할 때 여전히 aqvc에 의해 유지됩니다. 따라서이 문제를 피하기 위해서는 aqvc의 속성을이 경우에 보유하는 것이 아니라 속성을 할당하는 것이 좋습니다. 게시물을 수정했습니다. – gamozzii

1

그런 뷰 컨트롤러에서 변수에 액세스 할 수 없습니다. 전역 적으로 액세스 할 수있는 싱글 톤 클래스를 만드는 방법을 살펴보십시오. AppDelegate에서 액세스 할 수 있지만 글로벌 바를 사용하는 것은 좋지 않습니다.

+0

싱글 톤은 기술적으로는 효과가 있지만 OP의 문제에 대해서는 거의 틀린 디자인 선택입니다. 싱글 톤이 자리를 잡을 수도 있지만, 악용 될 경우 앱 디자인을 빨리 파괴 할 수 있습니다. 나는이 상황을 학대라고 부른다. –

2

우선, 세 번째 코드 블록에 오류가 있습니다. 이 :

RootViewController *rv = [RootViewController alloc] ; 

이되어야한다

RootViewController *rv = [[RootViewController alloc]init]; 

그러나 엄격하게 당신이 당신의 인스턴스 변수가 표시되지 않는 이유는 아니다 말하기.

정확하게 이해하면 처음 두 코드 블록은 RootViewController이고, AddQuoteViewController을 인스턴스화하고 제시합니다.그런 다음 AddQuoteViewController에있는 세 번째 코드 블록에서 RootViewController의 멤버 변수 (subject_id)에 액세스하려고합니다.

당신이 다른 인스턴스 RootViewController를 생성하고 있기 때문에, 작동하지 않을 것 AddQuoteViewController 내에서 RootViewController를 인스턴스화의 방법. 당신이 쫓고있는 것은 방금 나온 인스턴스의 가치입니다.

- (void) addQuote_Clicked:(id)sender { 

if(aqvController == nil) 
    aqvController = [[AddQuoteViewController alloc] initWithNibName:@"AddQuoteView" bundle:nil]; 

if(addNavigationController == nil) 
    addNavigationController = [[UINavigationController alloc] initWithRootViewController:aqvController]; 

aqvController.subject_id = self.subject_id; 

[self.navigationController presentModalViewController:addNavigationController animated:YES]; 
} 

당신은 AddQuoteViewController에 당신이했던 것과 같은 방법을 subject_id 속성을 만들어야합니다 :이 생성 때 아마도

을 할 수있는 가장 쉬운 방법은 AddQuoteViewController에 해당하는 속성을 생성하고 설정하는 것입니다 RootViewController.

+0

팁 주셔서 감사합니다. 나는 내 AddQuoteViewController가 바로 위에 작동하도록 subject_id 변수를 설정해야한다고 생각합니까? – jroyce

+0

예. 첫 번째 코드 블록에서'self.subject_id'와'sub.subject_id'를 말할 수있을 때 이미 해봤습니다. 'subject_id'는 gamozzii의 대답처럼 '@ property' 선언으로 선언되었습니다. –

관련 문제