在没有 segue 的情况下不断地在视图控制器之间传递数据?使用 SWIFT
Pass data between view controllers constantly without a segue? USING SWIFT
注意:我试图用 swift 解决这个问题,而不是 objective c。
我正在制作一个有 2 个视图控制器的应用程序,其中一个视图控制器的工作是从变量中减去点数,另一个视图控制器的工作是向该变量添加点数。
我怎样才能让两个视图控制器共享同一个变量,或者只是不断地在它们之间传递变量?
注意,2 个视图控制器与标签栏控制器相连,所以我不能使用 segue。我试过使用这段代码,但它不起作用。有什么建议吗?
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
var destviewcontroller: prizesViewController = segue.destinationViewController as prizesViewController
//first other coins them mine
destviewcontroller.coins1 = coins2
您可以在它自己的文件中创建一个全局变量,并在两个视图控制器中调用该变量:
struct Variables {
static var coinsVariable = 0
}
//call
Variables.coinsVariable = 10
你也可以制定一个协议,在其中设置一个函数来更新 coinValue。然后你可以在你的 ViewControllers 中使用它作为委托,并从委托中的方法中获取值。 Check the Apple Documentation how to use protocols.
实现此目的的一种可能方法是使用第三个 class,它保存变量。如果你使这个 class 成为单例,两个视图控制器将能够访问相同的值。
有关如何在 Swift 中创建单例的信息可以在此 Stack Overflow question 上找到。
但是,请确保变量访问线程安全。
您可以使用通知。我不知道它们在 Swift 中是如何工作的,但在 Objective C 中你可以 post a VariableShouldIncreaseNotification
和 VariableShouldDecreaseNotification
.
然后,您可以让第三个对象侦听这些通知并跟踪当前值,或者您可以决定其中一个 ViewController 是变量的所有者,它应该侦听来自另一个的通知.
无论哪种方式,通知都会使消息发送与消息处理脱钩,因此如果需要,以后可以更轻松地移动它。
将具有变量的 VC A 的引用传递给 B -- 现在 B 可以在 A 的 属性
上工作
如果更复杂,请考虑使用 A 符合的协议
将 'contract' 稍微形式化
看到被接受的答案很糟糕(在我看来),我想我会为其他人提供一个更明智的答案。
请注意,这也不是完美的,但更好。
在初始视图控制器中创建一个变量。
接下来,在 tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
函数中创建一个 indexPath.row 的 switch case,如下所示(请记住单元格从索引 0 开始):
switch indexPath.row {
case 0:
...
default:
...
}
然后在其中一种情况下,将您想要的值分配给您之前创建的变量。
执行self.performSegueWithIdentifier
然后添加下面的函数:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if (segue.identifier == "SegueIdentifier") {
let destination = segue.destinationViewController as! DestinationViewControllerClass
destination.variable = self.variable
}
}
显然,将 "SegueIdentifer" 与您的标识符、DestinationViewControllerClass 和 class 一起用于要将变量传递给的视图控制器(在您的情况下为 prizesViewController),以及变量名称添加到您的变量名称(分别为 coins1 和 self.coins2)。
注意:我试图用 swift 解决这个问题,而不是 objective c。
我正在制作一个有 2 个视图控制器的应用程序,其中一个视图控制器的工作是从变量中减去点数,另一个视图控制器的工作是向该变量添加点数。
我怎样才能让两个视图控制器共享同一个变量,或者只是不断地在它们之间传递变量?
注意,2 个视图控制器与标签栏控制器相连,所以我不能使用 segue。我试过使用这段代码,但它不起作用。有什么建议吗?
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
var destviewcontroller: prizesViewController = segue.destinationViewController as prizesViewController
//first other coins them mine
destviewcontroller.coins1 = coins2
您可以在它自己的文件中创建一个全局变量,并在两个视图控制器中调用该变量:
struct Variables {
static var coinsVariable = 0
}
//call
Variables.coinsVariable = 10
你也可以制定一个协议,在其中设置一个函数来更新 coinValue。然后你可以在你的 ViewControllers 中使用它作为委托,并从委托中的方法中获取值。 Check the Apple Documentation how to use protocols.
实现此目的的一种可能方法是使用第三个 class,它保存变量。如果你使这个 class 成为单例,两个视图控制器将能够访问相同的值。
有关如何在 Swift 中创建单例的信息可以在此 Stack Overflow question 上找到。 但是,请确保变量访问线程安全。
您可以使用通知。我不知道它们在 Swift 中是如何工作的,但在 Objective C 中你可以 post a VariableShouldIncreaseNotification
和 VariableShouldDecreaseNotification
.
然后,您可以让第三个对象侦听这些通知并跟踪当前值,或者您可以决定其中一个 ViewController 是变量的所有者,它应该侦听来自另一个的通知.
无论哪种方式,通知都会使消息发送与消息处理脱钩,因此如果需要,以后可以更轻松地移动它。
将具有变量的 VC A 的引用传递给 B -- 现在 B 可以在 A 的 属性
上工作如果更复杂,请考虑使用 A 符合的协议
将 'contract' 稍微形式化看到被接受的答案很糟糕(在我看来),我想我会为其他人提供一个更明智的答案。
请注意,这也不是完美的,但更好。 在初始视图控制器中创建一个变量。
接下来,在 tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
函数中创建一个 indexPath.row 的 switch case,如下所示(请记住单元格从索引 0 开始):
switch indexPath.row {
case 0:
...
default:
...
}
然后在其中一种情况下,将您想要的值分配给您之前创建的变量。
执行self.performSegueWithIdentifier
然后添加下面的函数:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if (segue.identifier == "SegueIdentifier") {
let destination = segue.destinationViewController as! DestinationViewControllerClass
destination.variable = self.variable
}
}
显然,将 "SegueIdentifer" 与您的标识符、DestinationViewControllerClass 和 class 一起用于要将变量传递给的视图控制器(在您的情况下为 prizesViewController),以及变量名称添加到您的变量名称(分别为 coins1 和 self.coins2)。