如何在撤消Segue时将信息传回iOS?

use*_*508 5 navigation xcode ios

我有两个视图控制器,一个和两个.我从VC One转到VC Two.在VC Two上,我选择了一些存储在数组中的数据.当我按下导航栏上的"后退"按钮时,我想将该阵列发送回VC One.

最好的方法是什么?

谢谢!

Sam*_*low 11

为什么不在第二个视图控制器上设置第一个可以注册为的委托属性.然后当信息存储到数组时,它也可以传递回它的委托?

实现这一点

在第二个视图控制器.h文件的顶部,您需要声明@protocol第一个视图控制器可以实现的.协议与其他语言的接口类似.这是一种确保对象实现某些方法的方法,而不需要具体知道该对象是什么(在这种情况下查看控制器1).

@protocol MyDataDelegate

- (void)recieveData:(NSArray *)theData

@end
Run Code Online (Sandbox Code Playgroud)

并且还为委托声明一个属性,第一个视图控制器可以在它呈现第二个视图之前设置它自己

@interface SecondViewController

@property (nonatomic, weak) id<MyDataDelegate> delegate;
Run Code Online (Sandbox Code Playgroud)

然后在第一个视图控制器.h文件中,实现协议

.h文件中

#import SecondViewController.h

@interface FirstViewController <MyDataDelegate>

//.....
Run Code Online (Sandbox Code Playgroud)

并在其中.m,实现协议中声明的方法

@implementation

//.... usual methods

- (void)recieveData:(NSArray *)theData {

    //Do something with data here
}
Run Code Online (Sandbox Code Playgroud)

为了将第一个视图控制器设置为委托,您需要通过使用UIStoryBoardDelegate方法拦截segue之前的segue.将其添加到第一个视图控制器

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

    //Get a handle on the view controller about be presented
    SecondViewController *secondViewController = segue.destinationViewController;

    if ([secondViewController isKindOfClass:[SecondViewController class]]) {
        secondViewController.delegate = self;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在你有一个指向第二个视图控制器的指针,并且可以通过在第二个视图控制器中调用以下方法来调用方法并传回数据

[self.delegate recieveData:theArrayData];

您还可以向协议添加另一种方法,以通知代理如果您愿意,第二个视图控制器正在被解除.或者使用其他答案中的一些建议