iOS - 如何在通过Manual Segue链接的两个视图控制器之间传递信息?
我有两个视图控制器,每个都分配给故事板中各自的视图。我控制 - 单击从拖动到另一个并选择“手动”“推”segue。
根据我的理解,我可以在代码中的任何地方执行此segue表单,为其提供标识符并使用:
performSegueWithIdentifier:@“identifierA”sender:self
将有关所选内容的信息发送到新创建的View Controller的最佳方法是什么?
答案 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文件,您可以使用指定的初始化程序并隐藏块属性,但是对于故事板,您必须公开创建块。