ViewController 数据共享

Posted

技术标签:

【中文标题】ViewController 数据共享【英文标题】:ViewController data sharing 【发布时间】:2011-02-15 04:56:25 【问题描述】:

所以我有两个视图控制器,当应用加载时我会在应用委托上加载它们。一个用于登录页面,其中我有用户名和密码,另一个是 UITabBarViewController。用户登录后,我只是删除了登录视图,因此显示了 UITabBarViewController。问题是在我的 UITabBarViewController 中,我需要 ViewController 的用户名和密码。我该如何解决这个问题?

附加信息:

这基本上是我想做的:

应用程序以登录页面开始:用户 ID、密码和登录按钮 单击登录按钮后,验证凭据后,我们必须将用户带到下一个屏幕 顶部的导航栏(本质上是 UINavigationController) 表格视图 底部的标签栏

现在登录后,我希望 UITabBarViewController 中的所有 ViewController 都能够获取用户在第一个登录屏幕中输入的用户名和密码。

【问题讨论】:

【参考方案1】:

我认为最好的设计是让标签栏的控制器呈现一个用于登录的模式视图控制器。然后,控制器选项卡栏将成为 LoginViewController 的委托,并且 LoginViewController 将在登录完成时通知其委托。当登录成功完成时,标签栏的控制器可以关闭 LoginViewController。

现在我在您更新答案后编写了此代码。您可以自己弄清楚如何添加 UINavigation 栏和表格视图。问题是关于在视图控制器之间传递数据而不是我回答如何一起通过一堆视图。如果您想了解更多关于将多个视图和控制器组合在一起以形成一个完整的应用程序的信息,我强烈推荐斯坦福大学的 iTunes U 课程。

我提供了一个完整、完整且有效的示例,演示了如何正确使用委托在 LoginViewController 和 UIViewController 之间共享数据(在您的情况下,UIViewController 将被您的标签栏控制器替换)。我还演示了如何使用 NSUserDefaults 来保存可以从其他地方访问的数据是应用程序。

示例的所有代码都可以在here找到。

【讨论】:

您能详细说明一下吗?我不太明白您所说的创建委托是什么意思?您是说使用新项目时生成的原始委托吗? 好的,我得到了你的解决方案..所以你正在使用模式视图进行登录? 无论如何,漂亮的解决方案..比下面建议的要好得多!谢谢埃文!【参考方案2】:

1 使用根控制器共享数据。

你可以把数据放在你的根控制器中,根控制器创建两个视图。

根控制器可以将数据传输到其子视图。

2 或者使用类构造函数。

当你创建视图时,你可以给它们提供数据参数。

【讨论】:

根控制器在哪里? 我认为他们的根意思是appDelegate。这很糟糕,因为共享这样的全球数据不是好的设计。它从您的视图控制器中添加了对应用程序委托的依赖。这使得它们很难在其他程序中重用。【参考方案3】:

这不是什么大问题。

您可以在 appDelegate 类中创建两个 NSString 变量并将属性设置为它们。这样您就可以在整个项目中访问这些变量。

您将在登录页面中设置值,并在 tabBarController 中访问这些值。

就是这样。

问候,

萨提亚

【讨论】:

像这样共享全局数据并不是好的设计。它从您的视图控制器中添加了对应用程序委托的依赖。这使得它们很难在其他程序中重用。

以上是关于ViewController 数据共享的主要内容,如果未能解决你的问题,请参考以下文章

动态呈现 ViewController

如何找到推送了哪个 viewController?

在 swift 中在 navigationStack 顶部重用相同的 viewController

ViewController 关闭 swift ios

为啥返回 ViewController 时 tableView Cell 会被选中?

Swift 3 / Alamofire 4:在 TableView 上使用 ID 获取数据