Bạn cần sử dụng các giao thức ủy quyền ... Dưới đây là cách thực hiện:
Khai báo một giao thức trong tệp tiêu đề thứ haiViewController của bạn. Nó sẽ giống như thế này:
#import <UIKit/UIKit.h>
@protocol SecondDelegate <NSObject>
-(void)secondViewControllerDismissed:(NSString *)stringForFirst
@end
@interface SecondViewController : UIViewController
{
id myDelegate;
}
@property (nonatomic, assign) id<SecondDelegate> myDelegate;
Đừng quên tổng hợp myDelegate trong tệp triển khai (SecondViewController.m) của bạn:
@synthesize myDelegate;
Trong tệp tiêu đề FirstViewController của bạn, hãy đăng ký giao thức SecondDelegate bằng cách thực hiện điều này:
#import "SecondViewController.h"
@interface FirstViewController:UIViewController <SecondDelegate>
Bây giờ khi bạn khởi tạo SecondViewController trong FirstViewController, bạn nên làm như sau:
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];
Cuối cùng, trong tệp triển khai cho bộ điều khiển chế độ xem đầu tiên của bạn (FirstViewController.m), hãy triển khai phương thức của SecondDelegate cho secondViewControllerDismissed:
- (void)secondViewControllerDismissed:(NSString *)stringForFirst
{
NSString *thisIsTheDesiredString = stringForFirst;
}
Bây giờ khi bạn sắp loại bỏ bộ điều khiển chế độ xem thứ hai, bạn muốn gọi phương thức được triển khai trong bộ điều khiển chế độ xem thứ nhất. Phần này đơn giản. Tất cả những gì bạn làm là, trong bộ điều khiển chế độ xem thứ hai, hãy thêm một số mã trước mã loại bỏ:
if([self.myDelegate respondsToSelector:@selector(secondViewControllerDismissed:)])
{
[self.myDelegate secondViewControllerDismissed:@"THIS IS THE STRING TO SEND!!!"];
}
[self dismissModalViewControllerAnimated:YES];
Các giao thức ủy nhiệm là CỰC KỲ, CỰC KỲ, CỰC KỲ hữu ích. Bạn sẽ rất tốt nếu làm quen với chúng :)
NSNotifications là một cách khác để thực hiện việc này, nhưng như một phương pháp hay nhất, tôi thích sử dụng nó hơn khi tôi muốn giao tiếp qua nhiều viewControllers hoặc đối tượng. Đây là câu trả lời tôi đã đăng trước đó nếu bạn tò mò về việc sử dụng NSNotifications: Kích hoạt các sự kiện trên nhiều bộ điều khiển chế độ xem từ một chuỗi trong appdelegate
BIÊN TẬP:
Nếu bạn muốn chuyển nhiều đối số, mã trước khi loại bỏ sẽ giống như sau:
if([self.myDelegate respondsToSelector:@selector(secondViewControllerDismissed:argument2:argument3:)])
{
[self.myDelegate secondViewControllerDismissed:@"THIS IS THE STRING TO SEND!!!" argument2:someObject argument3:anotherObject];
}
[self dismissModalViewControllerAnimated:YES];
Điều này có nghĩa là việc triển khai phương thức SecondDelegate bên trong firstViewController của bạn bây giờ sẽ giống như sau:
- (void) secondViewControllerDismissed:(NSString*)stringForFirst argument2:(NSObject*)inObject1 argument3:(NSObject*)inObject2
{
NSString thisIsTheDesiredString = stringForFirst;
NSObject desiredObject1 = inObject1;
}