我有两个视图控制器,一个和两个。我从一级风险投资转到二级风险投资。在VC Two上,我选择了一些存储在数组中的数据。当我按下导航栏上的"返回"按钮时,我想将该数组发送回VCOne。
最好的方法是什么?
谢谢!
为什么不在第二个视图控制器上设置一个委托属性,第一个可以注册为该属性。然后,当信息存储到数组中时,它也可以传递回它的委托?
要实现此
在第二个视图控制器.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发生之前拦截它。将此添加到第一个视图控制器
- (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];
如果需要,还可以向协议中添加另一个方法,以通知委托第二个视图控制器将被解除。或者使用其他答案中的一些建议
如果您使用的是iOS 6,则可以使用UnwindSegues将信息返回堆栈。
可能最简单的方法是使用NSNotification
。在您的prepareForSegue:
中,让VC One侦听来自VC Two的自定义通知。当VCTwo想要发送数组(可能是在其viewWillDisappear
中)时,它会发布该通知并将数组作为通知对象传递。VC One收到通知,此时停止侦听并使用数组。