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

时间:2014-08-16 13:36:47

标签: ios objective-c

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

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

根据我的理解,我可以在代码中的任何地方执行此segue表单,为其提供标识符并使​​用:

performSegueWithIdentifier:@“identifierA”sender:self

将有关所选内容的信息发送到新创建的View Controller的最佳方法是什么?

2 个答案:

答案 0 :(得分:0)

无论何时执行segue,此方法- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender都会通知控制器即将执行segue。

因此,通过此方法,您可以了解目标视图控制器,并且可以将任何属性/传递值设置为目标视图控制器的任何属性。

像这样。

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

     }


}

希望这有帮助

答案 1 :(得分:0)

我对你的问题感到有些困惑。

假设您有VC1打开VC2。

如果要将根控制器(vc1)中的信息传递给新控制器(vc2)

使用segue,你可以做的是在VC2中创建公共属性并在方法执行之前设置它。您可以在prepareForSegue方法中执行方法之前附加。所以实现将是这样的:

//
//  VC1.m
//  StackOverflow

#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
//  StackOverflow

#import <UIKit/UIKit.h>

@interface VC2 : UIViewController

@property(nonatomic, strong) NSString* myPassedString;

@end

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

如果要将信息从新控制器(vc2)传递回root(vc1)

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

以下是使用块的简单实现:

//
//  VC2.h
//  StackOverflow

#import <UIKit/UIKit.h>

@interface VC2 : UIViewController

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

@end


//
//  VC2.m
//  StackOverflow

#import "VC2.h"

@implementation VC2

-(void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];

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

@end

//
//  VC1.m
//  StackOverflow

#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文件,您可以使用指定的初始化程序并隐藏块属性,但是对于故事板,您必须公开创建块。