反转Segue时如何将信息传回iOS?

Posted

技术标签:

【中文标题】反转Segue时如何将信息传回iOS?【英文标题】:How to Pass information Back in iOS when reversing a Segue? 【发布时间】:2012-11-15 04:27:15 【问题描述】:

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

最好的方法是什么?

谢谢!

【问题讨论】:

【参考方案1】:

为什么不在您的第二个视图控制器上设置第一个可以注册的委托属性。那么当信息存入数组时,也可以传回给它的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];

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

【讨论】:

这听起来很有趣,但我不确定具体如何去做。 更新了我的答案,还请注意,按下后退按钮是不可能触发事件的,您需要另一个确认按钮或另一种方式来决定何时在用户按下返回之前发送回数据 在尝试实现时,Xcode 发送了一个错误:@property (nonatomic) MyDataDelegate *delegate; 代码在这里:` @protocol selectedDocument -(void) getSelectedDocumentList:(NSMutableArray *)selectedDocumentList; @end @interface LibrarySelectorViewController : UIViewController @property (nonatomic) selectedDocument *delegate;` 啊对不起,我的错!我将编辑答案,但您应该将行更改为 @property (nonatomic) id&lt;selectedDocument&gt; delegate;【参考方案2】:

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

【讨论】:

是的,我使用的是 iOS 6,所以会调查一下。谢谢。 我发现这非常有用:***.com/questions/13551778/…【参考方案3】:

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

【讨论】:

通知有时是过分的。委派最适合一对一沟通,而通知适合一对多。 @Abizern - 当关系实际上不是关于一个对象代表另一个对象做某事时,人们经常创建代表......这就是这个词的真正含义。我相信创建一个协议以便可以调用一个“委托”方法比注册通知更混乱。

以上是关于反转Segue时如何将信息传回iOS?的主要内容,如果未能解决你的问题,请参考以下文章

IOS - 如何使默认的后退按钮调用展开segue

Receiver MainVIewController 没有 segue iOS

如何将数据传回 Watchkit 中的接口控制器

从详细信息披露按钮 segue 传递对象

IOS:推送segue后导航栏消失

人工触发 Segue