5

我有两个视图控制器,一个和两个。我从 VC 1 转到 VC 2。在 VC 2 上,我选择了一些存储在数组中的数据。当我按下导航栏上的“返回”按钮时,我想将该数组发送回 VC One。

最好的方法是什么?

谢谢!

4

3 回答 3

11

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

为了实现这个

在您的第二个视图控制器 .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 方法在它发生之前拦截它。将此添加到第一个视图控制器

- (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];

如果需要,您还可以向协议添加另一个方法来通知委托第二个视图控制器正在被解除。或使用其他答案中的一些建议

于 2012-11-27T14:46:28.197 回答
4

如果您使用的是 iOS 6,您可以使用 UnwindSegues 将信息返回到堆栈中。

于 2012-11-28T09:59:54.563 回答
0

可能最简单的方法是使用NSNotification. 在您prepareForSegue:的 VC 1 中,收听来自 VC 2 的自定义通知。当 VC 2 想要发送数组时——也许在它的数组中viewWillDisappear——它会发布该通知并将数组作为通知对象传递。VC One 收到通知,此时停止侦听并使用阵列。

于 2012-11-27T14:23:05.503 回答