, 당신은 단지 '뒤로'버튼을 사용하여 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의에서 약한 참조를 사용하여
을 참조하십시오. _views_ 또는 _viewControllers_를 의미합니까? – foundry
편집 됨 컨트롤러보기 :) – Newbee
내비게이션 컨트롤러 안에 있습니까? 스토리 보드를 사용하고 있습니까? – foundry