【问题标题】:Shared variable between two tabs for XcodeXcode 的两个选项卡之间的共享变量
【发布时间】:2016-07-20 07:09:18
【问题描述】:

我正在处理两个视图控制器,它们都继承自基本视图控制器

  1. A_ViewController 类:BaseViewController
  2. 类 B_ViewController:BaseViewController

这两个 VC 都与我的 firebase 数据库进行了大量交互。所以我想要一个变量来跟踪所有下载的项目,以便这两个 VC 可以访问它而无需再次重新下载文件。

我尝试在 BaseViewController 中放一个变量名,供两个 A、B 类访问

    var allPostsDownloaded:  [Post]!

所以在 A_VC 下载任何数据之前,它会检查这个 allPostsDownloaded 变量,如果数据存在则从它加载。如果它不存在,我追加到这个变量。所以当切换到B_VC时,同样可以做到,不需要时不重新下载数据。

我没有使用 segue 或 protocal 来传递数据的原因是这两个 VC 与我的数据库交互非常频繁。因此,尝试使用相互数据变量来跟踪事物的位置要干净得多。

但是问题是我

var allPostsDownloaded:  [Post]!

每当我在 A 和 B VC(这是选项卡)之间切换时都会被调用。这将导致变量为空并取消初始化。

我想我可以改用全局变量,但这不是一个好习惯?谁能解释为什么当新标签出现时它会被重新调用?以及最好的解决方案。

【问题讨论】:

  • 每次加载视图控制器(选项卡)时都会发生这种情况,您正在创建BaseViewController 的新实例,因此是allPostsDownloaded 的新实例。您可能应该创建一个单独的类来存储下载信息。然后,您可以将引用(同一个)传递给每个视图控制器,或者您可以创建该类的单例(共享实例)并使用它。
  • 答案也很好。谢谢

标签: ios objective-c swift xcode global-variables


【解决方案1】:

正如@avi 提到的创建新的单例类,那么您可以轻松通过和阅读。下面是一个例子

class PersistentData
{
    static let sharedInstance = PersistentData()

    // your global persistent variable
    var allPostsDownloaded = [Post]()
}

所以在你的控制器中你可以简单地读取和设置如下

// read
print(PersistentData.sharedInstance.allPostsDownloaded)

// set new data. this just example, hence depends on your case
PersistentData.sharedInstance.allPostsDownloaded.append(newPost)
PersistentData.sharedInstance.allPostsDownloaded = posts

还请记住,如果您想在标签之间切换时读取新值,您可以在viewDidAppearviewWillAppear 中获取更新

【讨论】:

  • 感谢代码示例。它就像一个魅力。并感谢其他人的回答
【解决方案2】:

您可以使用实例变量创建单例类,并可以保存所有下载的数据,并且可以从项目类的任何位置访问单例类变量。

【讨论】:

  • 谢谢伙计。这有帮助
猜你喜欢
  • 1970-01-01
  • 2012-08-22
  • 2014-03-07
  • 1970-01-01
  • 1970-01-01
  • 2011-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多