如何将数据传回?
如果我们想将数据从 SecondViewController 传递回 FirstViewController,我们需要使用协议和委托。为此,我们必须让 FirstViewController 成为 SecondViewController 的代表。如果我们这样做,它允许 SecondViewController 将消息发送回 FirstViewController,从而使我们能够发送回数据。
如果 FirstViewController 必须是 SecondViewController 的委托,它必须符合 SecondViewController 的协议。我们必须确保正确指定协议。这告诉 FirstViewController 它需要实现哪些方法。
在 SecondViewController.h 中,在所有 #import 语句之后,但在 @interface 行之前,我们需要指定协议,如下所示:
@class SecondViewController;
@protocol SecondViewControllerDelegate
- (void)addItemViewController:(SecondViewController *)controller didFinishEnteringItem:(NSString *)item;
@end
接下来,仍然在 SecondViewController.h 中,您需要设置一个委托属性并在 SecondViewController.m 中进行合成,如下所示:
@property (nonatomic, weak) id 委托;
在 SecondViewController 中,当我们弹出视图控制器时,我们会在委托上调用消息。
NSString *itemToPassBack = @"这个值返回到FirstViewController";
[self.delegate addItemViewController:self didFinishEnteringItem:itemToPassBack];
SecondViewController 就是这样。现在在 FirstViewController.h 中,告诉 FirstViewController 导入 SecondViewController 并遵守它的协议。
#import "SecondViewController.h"
@interface FirstViewController : UIViewController
在 FirstViewController.m 中,从我们的协议中实现以下方法:
- (void)addItemViewController:(SecondViewController *)controller didFinishEnteringItem:(NSString *)item
{
NSLog(@"这是从 SecondViewController 返回的 %@",item);
}
现在,我们需要做的就是在将 SecondViewController 推送到导航堆栈之前告诉 SecondViewController FirstViewController 是它的委托。在 FirstViewController.m 中添加以下更改:
SecondViewController *secondViewController = [[SecondViewController alloc] initWithNib:@"SecondViewController" bundle:nil];
secondViewController.delegate = self
[[self navigationController] pushViewController:secondViewController 动画:YES];
就是这样!您现在可以将数据从 SecondViewController 发送到 FirstViewController。
The source