2015-10-19 70 views
0

我在Swift中开发相当新,而且我似乎正在努力解决其中一个关键概念。访问/传递多个ViewControllers之间的公共数据

我正在寻找在不同的UIViewControllers之间传递数据,让他们都可以访问和操作它。

例如,在我的应用程序中,我创建了一个包含项目数组的简单数据存储类。我希望这个数组可以被所有ViewController访问。

我初始化中的AppDelegate店:

var itemStore = ItemStore() 

然后我创建第一个UIViewController中,并通过在存储,以便它可以访问它:

FirstViewController(itemStore: ItemStore) 

因此,要做到这一点,我需要对FirstViewController的init进行更改,以便它能够接受itemStore作为参数。

然后,我想将该数据传递给SecondViewController,然后传递给ThirdDataController。

我似乎没有必要编辑每一个UIViewController类,以便它接受itemStore作为参数。

我在这里有什么选择?有些人告诉我将数据存储为AppDelegate的一个属性,以便所有人均可访问。但是,这似乎不是正确的做法。

有什么建议吗?

回答

2

您可以使用赛格瑞这样传递数据:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) { 
    if (segue.identifier == “segueTest”) { 

     var svc = segue.destinationViewController as secondViewController; 

     svc.toPass = textField.text 
    } 
} 

另一种解决方案

class AnsViewController: UIViewController { 
    var theNum: Int 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     println(theNum) 
    } 

} 

override func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!) { 
    let viewController = self.storyboard.instantiateViewControllerWithIdentifier("ansView") as AnsViewController 
    viewController.num = theNum 
    self.presentViewController(viewController, animated: true, completion: nil) 
} 

与教程完整演示解决方案可能会对你有所帮助。

Tutorial

编辑添加NSUserDefault解保存数据

let highscore = 1000 
let userDefaults = NSUserDefaults.standardUserDefaults() 
userDefaults.setValue(highscore, forKey: "highscore") 
userDefaults.synchronize() // don't forget this!!!! 

Then, when you want to get the best highscore the user made, you have to "read" the highscore from the dictionary like this: 

if let highscore = userDefaults.valueForKey("highscore") { 
    // do something here when a highscore exists 
} 
else { 
    // no highscore exists 
} 
I hope this helps! 

NSUserDefaults的支持以下数据类型:

的NSString的NSNumber的NSDate的NSArray的NSDictionary NSData的

这是Complete Demo Code, might be helpful to you

+0

因此,将下一个ViewController的属性设置为您传递的数据。然而,我觉得你必须一遍又一遍地传递它(如果你从AViewController到BViewController到CViewController),这似乎很奇怪。有没有办法在全球范围内访问它? –

+0

@BrianMarsh是的,只是在顶层声明它。如果你希望它只在这两个视图控制器上可用,请将它们放在同一个swift文件中,并声明你在这个文件的顶层隐藏了var private –

+0

@BrianMarsh,你也可以将它保存在UserDefault上。或本地数据库或.Plist文件..有很多方法。在这里我已经给你实现它的最简单的方法。 – Mehul

相关问题