2013-01-17 6 views
0

제목 자체로 내 질문에 충분하다. 그러나 나는 여기에서 더 설명 할 것이고 두 개의 뷰 컨트롤러 A와 B를 가지고 있다고 가정 할 것이다. A는베이스이고 B를 밀고있다. 하나의 상황에서 하나의 버튼이 뷰 (B)에서 클릭 될 때 A가 B로부터 암시되기를 원한다. 목표 C는 그 인스턴스를 가지고 있다면 뷰를 직접 호출 할 수 있습니다. 나는 그렇게하는 것이 좋은 습관이 아니라고 생각합니다. 이 사건을 처리하는 방법 ..Objective C에서 순환 호출을 피하는 방법은 무엇입니까?

귀하의 제안에 감사드립니다. 당신은 당신이 처음에 B를 밀어에 대한 책임은 A를 호출하고 싶은 말은 'A는 B로부터 암시'에 의한 경우

+0

을 참조하십시오. _views_ 또는 _viewControllers_를 의미합니까? – foundry

+0

편집 됨 컨트롤러보기 :) – Newbee

+0

내비게이션 컨트롤러 안에 있습니까? 스토리 보드를 사용하고 있습니까? – foundry

답변

2

, 당신은 단지 '뒤로'버튼을 사용하여 A, 또는 코드로 돌아가 :

[self.navigationController popViewController animated:YES]; 
A와 포인터를 필요로하지 않는다

B는 네비게이션 컨트롤러는 것을 가지고, 그것은 B.

을 만들 때 탐색 컨트롤러 B의 navigationController 속성을 설정하기 때문에 사용자가 설정해야하는 경우 B는 탐색 컨트롤러에 대한 포인터를 가지고 B의 일부 액션을 기반으로하는 A의 속성을 사용하려면 대리인을 사용해야합니다.

B에서 delegate이라는 속성을 만듭니다. 당신은 B를 만들 때에

는에의 대리자를 설정 A :

당신이 팝업 전에 대리인을 통해 다시 호출 할 수 있습니다 B에서 다음
ViewControllerB* vcB = [[ViewControllerB alloc] init]; 
vcB.delegate = self; 
[self.navigationController pushViewController:vcB]; 

:

[self.delegate sendMessageWithValue:someValue]; 
[self.navigationController popViewController animated:YES]; 

당신이 만약 특별히 조심하고 싶다면 다음을 사용하여 메시지 전달을 묶을 수 있습니다.

if ([self.delegate respondsToSelector:@selector(sendMessageWithValue:)]) { ... } 

B를 알지 못하면이 작업을 수행하려면 당신이 B의 @interface에서 delegate 속성을 선언하는 경우에 대해서는,이 대리자임을 이외, B는 (@interface 위) 헤더에 위임 프로토콜

@protocol BDelegateProtocol 
- (void) sendMessageWithValue:(int)someValue; 
@end 

를 선언해야한다,이 따를 것으로 예상되는 프로토콜을 지정합니다 :

#import BViewController; 

@interface AViewController:UIViewController <BDelegateProtocol> 

이 :

@property (nonatomic, weak) id <BDelegateProtocol> delegate; 

과의 @interface 헤더에

, 당신은 그 프로토콜을 따르는 것이 광고 당신이 맺은 느슨한 결합입니다. B는 A의 헤더를 가져올 필요가 없습니다. B의 프로토콜 명세를 따르는 것 외에는 A에 대해 아무것도 알 필요가 없습니다.

B는 A에 대한 포인터를 보유하지만 약한 포인터입니다. 이건 매우 중요합니다. 델리게이트 속성이 이면 B는 델리게이트의 보유 수를 1만큼 증가시킵니다. 델리게이트 이 B에 대한 강력한 포인터를 보유하고 있으면 델리게이트가 해제 될 수 없습니다. B는 항상 A가 존재하는 동안 적어도 1의 보유 수를 가지며, 마찬가지로 B가 존재하는 동안 A는 항상 보유 수 1을가집니다. 어느 것도 파괴 될 수 없습니다.

이 특별한 경우에는 A가 Nav Controller와 같이 B를 유지할 필요가 없습니다. 그러나 위임자가 자주 위임자를 생성하고 소유하는 개체 인 경우 자주 발생할 수있는 상황입니다 . Apple의에서 약한 참조를 사용하여

+0

특정 버튼을 클릭하면보기 A에 플래그를 설정하고 싶습니다.이 경우 B를 팝업하지 않으려합니다. – Newbee

+0

이것은 순환 참조가 Delegate와 함께 Objective C에서 어떻게 처리 되는가? – Newbee

+0

@ 새비지, 당신은 대의원을 사용해야합니다. 업데이트 된 답변보기 – foundry