如何在情节提要中的 2 个视图控制器之间传递数据?

Posted

技术标签:

【中文标题】如何在情节提要中的 2 个视图控制器之间传递数据?【英文标题】:How to pass data between 2 view controllers in storyboards? 【发布时间】:2013-11-11 12:19:34 【问题描述】:

假设我们有 2 个名为 ViewControllerA 的视图控制器 和 ViewControllerB

当我不使用情节提要时,我有以下初始化机制。

//ViewControllerA.h

@interface ViewControllerA : UIViewController

@end

//ViewControllerA.m

@implementation ViewControllerA

- (IBAction)showViewControllerB:(id)sender 
    ViewControllerB *vcB = [[ViewControllerB alloc] initWithTitle:@"Test"];
    [self.navigationController pushViewController:vcB animated:YES];
 

@end

//ViewControllerB.h

@interface ViewControllerB : UIViewController

- (id)initWithTitle:(NSString *)title;

 @end

//ViewControllerB.m

@interface ViewControllerB()

@property (nonatomic, retain) NSString *title;//Private scope.

@end

@implementation ViewControllerB

- (id)initWithTitle:(NSString *)title 
    self = [self init];
    if(self)
    
        _title = title;
    
    return self; 


@end

如何在不在公共范围 (ViewControllerB.h) 中声明 title 属性的情况下使用情节提要实现此目的?

提前致谢。

【问题讨论】:

您说“使用情节提要实现这一目标”是什么意思? @Popeye 是的,但没有在 .h 文件中声明 ViewControllerB 的 title 属性。如上例所述,它应该在 .m 文件(私有范围)中。 你的问题一点都不清楚。 @Popeye,您需要从上述问题中得到什么澄清?我可以解释我的问题。 好吧,我们知道您想要一个私有财产或来自 cmets 的 o_O 东西,但是您在问题中的什么地方这么说,这与故事板有什么关系?你的问题没有意义。 【参考方案1】:

您可以使用KVC 访问该属性。

- (IBAction)showViewControllerB:(id)sender 

    ViewControllerB *viewcontroller = [self.storyboard instantiateViewControllerWithIdentifier:@"ViewControllerB"]; // corresponding to the storyboard identifier
    [viewcontroller setValue:@"Hello World" forKey:@"title"];
    [self.navigationController pushViewController:viewcontroller animated:YES];

【讨论】:

【参考方案2】:

如果您确实需要将属性保密,您可以使用objc_setAssociatedObject 将数据附加到vcB 对象。或者您可以将属性保存在 AppDelegate 中,并在 ViewControllerB 初始化时从那里获取它。

【讨论】:

【参考方案3】:
UIStoryboard *storyboard=self.storyboard;

ViewControllerB *vc=(ViewControllerB*)[storyboard instantiateViewControllerWithIdentifier:@"Scene_Id"];

[vc setTitle:@"your Text"];

[self.navigationController pushViewController:vc animated:YES];

【讨论】:

请检查我的问题,title 属性必须在 ViewControllerB.m 文件中,而不是在 .h 文件中(私有范围)。

以上是关于如何在情节提要中的 2 个视图控制器之间传递数据?的主要内容,如果未能解决你的问题,请参考以下文章

在没有任何情节提要参考的情况下在控制器之间传递数据

使用情节提要时使用 UITabBarController 在视图之间传递数据

如何在多个 .xib 文件之间执行展开转场(不使用情节提要)

iOS 在使用情节提要推送视图控制器时传递数据

如何正确处理情节提要中的类似视图,这些视图具有类似的控制器而无需重复代码?

使用情节提要(iOS)时如何将 NSManagedObjectContext 传递给视图控制器