iOS - 如何在通过手动 Segue 链接的两个视图控制器之间传递信息?

Posted

技术标签:

【中文标题】iOS - 如何在通过手动 Segue 链接的两个视图控制器之间传递信息?【英文标题】:iOS - How can I pass information between two view Controllers linked through a Manual Segue? 【发布时间】:2014-08-16 13:36:46 【问题描述】:

我有两个视图控制器,每个控制器都分配给故事板中各自的视图。 I Control-Click 从一个拖动到另一个并选择一个“手动”“推”segue。

据我了解,我可以在代码中的任何地方执行这个 segue 表单,方法是给它一个标识符并使​​用:

performSegueWithIdentifier:@"identifierA" sender:self

将有关所选内容的信息发送到新创建的视图控制器的最佳方式是什么?

【问题讨论】:

请不要使用 NSUserDefaults。见***.com/questions/8458256/…、***.com/questions/11577484/…、***.com/questions/7864371/…等 我不知道 NSUserDefaults 是什么,但从它的外观来看,我受益于我的不知道。似乎下面的答案和你的链接都指向同一个方向 segue.destinationViewController 返回一个指针,指向故事板中 segue 指向的未来控制器。我会用那个。谢谢。 【参考方案1】:

每当您执行转场时,此方法- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 会通知控制器即将执行转场。

所以通过这个方法你可以了解目标视图控制器,你可以设置任何属性/传递值到目标视图控制器的任何属性。

类似的东西。

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

    // Get the new view controller using [segue destinationViewController].
    // Pass the selected object to the new view controller.

    if([segue.identifier isEqualToString:@"yourIdentifier"] )
        YOUR_Destination_Controller *vc = (YOUR_Destination_Controller *)  segue.destinationViewController;
        vc.someProperty = YES;   //in example someProperty is a BOOL 
     
      else 
        //Do whatever accordingly

     



希望对你有帮助

【讨论】:

好的,所以当调用 prepareForSegue 并且我在 segue.destinationViewController 中访问指向它的指针时,已经创建了“未来”控制器?【参考方案2】:

我对你的问题有点困惑。

假设您有打开 VC2 的 VC1。

如果您想将信息从根控制器(vc1)传递到新控制器(vc2)

最好使用 segues 在 VC2 中创建公共属性并在方法执行之前对其进行设置。您可以在 prepareForSegue 方法中执行方法之前附加。所以实现将是这样的:

//
//  VC1.m
//  ***

#import "VC1.h"
#import "VC2.h"

@implementation VC1



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

    if( [segue.identifier isEqualToString:@"yourSegueId"] )
    
        if( [segue.destinationViewController isKindOfClass:[VC2 class]] )
        
            [(VC2*)segue.destinationViewController setMyPassedString:@"YOUR STRING FROM VC1"];
        
    


@end

//
//  VC2.h
//  ***

#import <UIKit/UIKit.h>

@interface VC2 : UIViewController

@property(nonatomic, strong) NSString* myPassedString;

@end

我个人不喜欢这种方法,因为您在 VC2 上创建公共属性,这可能根本不需要。然而,这是对故事板工作方式的限制,避免这种情况的唯一方法是使用老式的 xib 和指定的初始化程序,您可以在其中放置参数。

如果您想将信息从新控制器(vc2)传回根(vc1)

在这里,您基本上可以使用两种方法:将弱引用传递给 vc2,将其存储,然后在需要更新 vc1 上的某些内容时使用它。这称为委托模式,但它可以以更强大和更封装的方式使用,称为BLOCKS。

下面是块的简单实现:

//
//  VC2.h
//  ***

#import <UIKit/UIKit.h>

@interface VC2 : UIViewController

@property(nonatomic, copy) void(^vc1UpdateBlock)(NSString* string);

@end


//
//  VC2.m
//  ***

#import "VC2.h"

@implementation VC2

-(void)viewWillDisappear:(BOOL)animated

    [super viewWillDisappear:animated];

    _vc1UpdateBlock(@"PUT YOUR PASSED STRING HERE");


@end

//
//  VC1.m
//  ***

#import "VC1.h"
#import "VC2.h"

@implementation VC1



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

    if( [segue.identifier isEqualToString:@"yourSegueId"] )
    
        if( [segue.destinationViewController isKindOfClass:[VC2 class]] )
        
            [(VC2*)segue.destinationViewController setVc1UpdateBlock:^(NSString * stringFromVC2) 

                NSLog(@"I'm printing in VC1 string %@, passed from VC2", stringFromVC2);

            ];
        
    


@end

同样,如果您直接使用 xib 文件,您可以使用指定的初始化程序并隐藏块属性,但是对于情节提要,您必须创建公开可用的块。

【讨论】:

以上是关于iOS - 如何在通过手动 Segue 链接的两个视图控制器之间传递信息?的主要内容,如果未能解决你的问题,请参考以下文章

IOS开发。如何通过 segue 连接不同故事板中的两个场景

如何通过界面生成器更改导航项标题?

如何在 iOS 应用程序中手动设置“返回”目的地

iOS Swift 使用 Segue 在 vi​​ewController 之间传递变量

如何在 AppDelegate 中执行 Segue?

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