如何在 2 个不同的视图控制器之间传递信息?

Posted

技术标签:

【中文标题】如何在 2 个不同的视图控制器之间传递信息?【英文标题】:How can I pass information between 2 different View Controllers? 【发布时间】:2010-04-15 15:52:56 【问题描述】:

这是一个简单的问题:

我有 2 个不同的视图控制器,每个控制器都有自己的数据存储在其 .m 文件中。 我想取一个值,例如,在 ViewController1 中声明的整数值 (int i=3;) 并将其传递给 ViewController2,这样我就可以在第二个视图控制器中使用该值。

谁能告诉我怎么做?

【问题讨论】:

【参考方案1】:

2014 年编辑 - 万一有人遇到这种情况,不要听我的。 “更好的方式”确实是最好的方式。

好方法 - 在 ViewController2 上创建自己的 initWithI 方法

更好的方法 - 像往常一样创建 ViewController2,然后将值设置为属性。

最佳方式 - 这是一种代码味道,您将数据与 ViewController 紧密耦合。请改用 CoreData 或 NSUserDefaults。

【讨论】:

NSUserDefaults 听起来是最简单的解决方案。【参考方案2】:

用该值初始化新的视图控制器。

- (id)initWithValue:(int)someValue 
    if (self = [super initWithNibName:@"MyViewController" bundle:nil]) 
        myValue = someValue;
    
    return self;

然后从您的另一个视图控制器(假设这个另一个视图控制器由 UINavigationController 拥有)

- (void)showNextViewControler 
    MyViewController *vc = [[[MyViewController alloc] initWithValue:someValue] autorelease]
    [self.navigationController pushViewController:vc animated:YES];

和/或在初始化之后执行它,创建一个允许您设置它的方法或属性。

- (void)setSomeValue:(int)newValue 
    myValue = newValue;

然后

- (void)showNextViewControler 
    MyViewController *vc = [[[MyViewController alloc] initWithNibName:@"Foo" bundle:nil] autorelease]
    [vc setValue:someValue]
    [self.navigationController pushViewController:vc animated:YES];

【讨论】:

【参考方案3】:

如果您将 ViewController1 嵌入到 UINavigationController 中,这是一个非常常见的用例。在 ViewController1 中,在要显示 ViewController2 的位置添加以下代码(例如在操作中):

ViewController2 *controller = [[ViewController2 alloc] initWithNibName:<nibName> bundle:nil];
[controller setData:<your shared data>]; 
[self.navigationController pushViewController:controller animated:YES];
[controller release];

导航控制器会处理剩下的事情。

【讨论】:

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

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

我将如何使用相同的视图控制器,但通过它传递不同的信息?

如何通过控制器将两个不同模型的值作为 Laravel 8 中的单个返回变量传递给视图文件

如何在 PageViewController 和 ViewController 之间传递数据?

如何在 Swift 中的视图控制器之间传递数据?

在视图控制器之间有很多segues可以吗?