위임 프로토콜을 사용해야합니다 ... 방법은 다음과 같습니다.
secondViewController의 헤더 파일에서 프로토콜을 선언하십시오. 다음과 같이 표시되어야합니다.
#import <UIKit/UIKit.h>
@protocol SecondDelegate <NSObject>
-(void)secondViewControllerDismissed:(NSString *)stringForFirst
@end
@interface SecondViewController : UIViewController
{
id myDelegate;
}
@property (nonatomic, assign) id<SecondDelegate> myDelegate;
구현 (SecondViewController.m) 파일에서 myDelegate를 합성하는 것을 잊지 마십시오.
@synthesize myDelegate;
FirstViewController의 헤더 파일에서 다음을 수행하여 SecondDelegate 프로토콜을 구독하십시오.
#import "SecondViewController.h"
@interface FirstViewController:UIViewController <SecondDelegate>
이제 FirstViewController에서 SecondViewController를 인스턴스화 할 때 다음을 수행해야합니다.
SecondViewController *second = [[SecondViewController alloc] initWithNibName:"SecondViewController" bundle:[NSBundle mainBundle]];
SecondViewController *second = [SecondViewController new];
second.myString = @"This text is passed from firstViewController!";
second.myDelegate = self;
second.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
[self presentModalViewController:second animated:YES];
[second release];
마지막으로 첫 번째 뷰 컨트롤러 (FirstViewController.m)의 구현 파일에서 secondViewControllerDismissed에 대한 SecondDelegate의 메서드를 구현합니다.
- (void)secondViewControllerDismissed:(NSString *)stringForFirst
{
NSString *thisIsTheDesiredString = stringForFirst;
}
이제 두 번째 뷰 컨트롤러를 닫으려고 할 때 첫 번째 뷰 컨트롤러에서 구현 된 메서드를 호출하려고합니다. 이 부분은 간단합니다. 두 번째 뷰 컨트롤러에서 해제 코드 앞에 코드를 추가하면됩니다.
if([self.myDelegate respondsToSelector:@selector(secondViewControllerDismissed:)])
{
[self.myDelegate secondViewControllerDismissed:@"THIS IS THE STRING TO SEND!!!"];
}
[self dismissModalViewControllerAnimated:YES];
위임 프로토콜은 매우, 매우, 매우 유용합니다. 그들에 익숙해지면 좋을 것입니다 :)
NSNotifications는이를 수행하는 또 다른 방법이지만 모범 사례로서 여러 viewController 또는 개체간에 통신하려는 경우 사용하는 것을 선호합니다. NSNotifications 사용에 대해 궁금한 경우 이전에 게시 한 답변은 다음과 같습니다 . appdelegate의 스레드에서 여러 뷰 컨트롤러에 걸쳐 이벤트 발생
편집하다:
여러 인수를 전달하려는 경우 닫기 전 코드는 다음과 같습니다.
if([self.myDelegate respondsToSelector:@selector(secondViewControllerDismissed:argument2:argument3:)])
{
[self.myDelegate secondViewControllerDismissed:@"THIS IS THE STRING TO SEND!!!" argument2:someObject argument3:anotherObject];
}
[self dismissModalViewControllerAnimated:YES];
즉, firstViewController 내부의 SecondDelegate 메서드 구현이 다음과 같이 보일 것입니다.
- (void) secondViewControllerDismissed:(NSString*)stringForFirst argument2:(NSObject*)inObject1 argument3:(NSObject*)inObject2
{
NSString thisIsTheDesiredString = stringForFirst;
NSObject desiredObject1 = inObject1;
}