我有两个视图控制器,一个和两个。我从VC One转到VC Two。在VC Two上,我选择了一些存储在数组中的数据。当我按导航栏上的“后退”按钮时,我想将该阵列发送回VC One。
最好的方法是什么?
谢谢!
答案 0 :(得分:11)
为什么不在第二个视图控制器上设置第一个可以注册为的委托属性。然后,当信息存储到数组时,它也可以传递回它的委托?
实现此
在第二个视图控制器.h文件的顶部,您需要声明第一个视图控制器可以实现的@protocol
。协议与其他语言的接口类似。这是一种确保对象实现某些方法的方法,而无需具体知道该对象是什么(在这种情况下查看控制器1)。
@protocol MyDataDelegate
- (void)recieveData:(NSArray *)theData
@end
并且还为委托声明了一个属性,第一个视图控制器可以在它呈现第二个
之前设置它自己@interface SecondViewController
@property (nonatomic, weak) id<MyDataDelegate> delegate;
然后在您的第一个视图控制器.h
文件中,实现协议
在.h
文件
#import SecondViewController.h
@interface FirstViewController <MyDataDelegate>
//.....
并在.m
中实现协议中声明的方法
@implementation
//.... usual methods
- (void)recieveData:(NSArray *)theData {
//Do something with data here
}
为了将第一个视图控制器设置为委托,您需要通过使用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;
}
}
现在你有一个指向第二个视图控制器的指针,可以通过在第二个视图控制器中调用以下方法来调用方法并传回数据
[self.delegate recieveData:theArrayData];
您还可以向协议添加另一种方法,以通知代理如果您愿意,第二个视图控制器正在被解除。或者使用其他答案中的一些建议
答案 1 :(得分:4)
如果您使用的是iOS 6,则可以使用UnwindSegues将信息返回堆栈。
答案 2 :(得分:0)
可能最简单的方法是使用NSNotification
。在prepareForSegue:
让VC One收听来自VC Two的自定义通知。当VC Two想要发送数组时 - 可能在其viewWillDisappear
中 - 它发布该通知并将数组作为通知对象传递。通知VC One,此时停止侦听并使用该阵列。