2015-10-19 3 views
0

Я довольно новичок в разработке в Swift, и я, похоже, борюсь с одним из ключевых понятий.Доступ или передача общих данных между несколькими ViewControllers

Я ищу для передачи данных между различными UIViewControllers, позволяя им получить доступ и манипулировать им.

Например, в моем приложении я создал простой класс хранилища данных, содержащий и массив элементов. Я хочу, чтобы этот массив был доступен всем ViewControllers.

Я инициализируется магазин в AppDelegate:

var itemStore = ItemStore() 

Я затем создать первый UIViewController и передать в магазине, так что он имеет доступ к нему:

FirstViewController(itemStore: ItemStore) 

Так, чтобы сделать это мне нужно внести изменения в init FirstViewController, чтобы он мог принимать itemStore в качестве аргумента.

Затем я хочу передать эти данные в SecondViewController, а затем в ThirdDataController.

Мне кажется ненужным, что я должен редактировать каждый отдельный класс UIViewController, чтобы он принимал itemStore в качестве аргумента.

Какие у меня варианты? Некоторые люди сказали мне хранить данные как свойство AppDelegate, чтобы они были доступны всем. Однако, похоже, это не правильный способ сделать это.

Любые советы?

ответ

2

Вы можете передавать данные, используя SEGUE так:

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 да просто объявите его на верхнем уровне. Если вы хотите, чтобы он был доступен только на этих двух контроллерах представления, поместите их в один и тот же быстрый файл и объявите var var private в этом файле на верхнем уровне –

+0

@BrianMarsh, вы также можете сохранить его на UserDefault.или локальной базы данных или в файле .Plist. Есть много способов. здесь я дал вам самый простой способ его реализации. – Mehul

Смежные вопросы