2015-02-19 2 views
3

Мой текущий проект - это проект Core Data в Swift, который создает заметки. Я пытаюсь установить managedObjectContext моего destinationVC из currentVC в prepareForSegue, и я пытаюсь выяснить, как это сделать в Swift.Передача управляемого объекта ObjectContext с одного ViewController на другой ViewController в Swift?

Я использовал «консервированный код» Apple для создания проекта CoreData в Swift. Стек CoreData настроен в AppDelegate.swift.

В настоящее время я создал метод создания фиктивных заметок в AppDelegate, если в контексте управляемых объектов нет заметок. Это работает.

Начальный вид при открытии приложения - это настройка VC Master-Detail, которая отображает объекты в моем контексте управляемых объектов. Это работает. Я могу щелкнуть заметку, и она отображается на DetailViewController. Это в основном «консервированный» код, создаваемый Xcode при запуске проекта.

Я создал кнопку UIBarButtonItem «Добавить» на MasterViewController, но я не могу понять, как передать MasterVC «s managedObjectContext к destinationViewController. Когда я нажимаю это, он перебирается так, как следует, на DetailViewController.

Вот свойства от моего MasterVC:

var detailViewController: DetailViewController? = nil 
var addNoteViewController:AddNoteViewController? = nil // I added this 
var managedObjectContext: NSManagedObjectContext? = nil 

Это мой prepareForSegue метод в MasterViewController.

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "showDetail" { 
     if let indexPath = self.tableView.indexPathForSelectedRow() { 
      let object = self.fetchedResultsController.objectAtIndexPath(indexPath) as! NSManagedObject 
      let controller = (segue.destinationViewController as! UINavigationController).topViewController as! DetailViewController 
      controller.detailItem = object 
      controller.navigationItem.leftBarButtonItem = self.splitViewController?.displayModeButtonItem() 
      controller.navigationItem.leftItemsSupplementBackButton = true 
     } 
    } 

    if segue.identifier == "addNote" { 
     println("segue.identifier is addNote") 
     // I think I need to add stuff here so the destination VC "sees" the managedObjectContext 
    } 
} 

Я думаю, что также нужно добавить свойство на AddNoteVC, что можно установить MasterVC «s prepareForSegue. Итак, как мне это сделать в Swift?

+1

Пожалуйста, избегайте подобных заголовков и держите его кратким. – Cesare

ответ

0

Тайна решена:

я добавил эта строка кода к AddNoteViewController, ничего в prepareForSegue в MasterViewController.swift

let managedObjectContext = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext

+1

Это тоже работает, хотя вы можете посмотреть на эту статью: [Скажите, не спрашивайте] (https://pragprog.com/articles/tell-dont-ask). В вашем решении вы запрашиваете * для контекста управляемого объекта из контроллера представления. «Чистый» шаблон - это * указать * диспетчеру просмотра, какой контекст использовать. (Однако, вероятно, это не имеет значения в данном конкретном случае.) –

+0

Как только я получу свою проблему с GitHub или раскадровкой, я буду возиться. Спасибо! – Adrian

2

Чтобы добавить собственность к вашему AddNoteViewController, просто добавьте var:

import CoreData 

class AddNoteViewController: UIViewController { 

    var managedObjectContext : NSManagedObjectContext? 

Тогда вы можете установить это свойство в вашем Segue:

if segue.identifier == "addNote" { 
    println("segue.identifier is addNote") 
    // I think I need to add stuff here so the destination VC "sees" the managedObjectContext 

    let controller = (segue.destinationViewController as! UINavigationController).topViewController as! AddNoteViewController 
    controller.managedObjectContext = managedObjectContext 
} 
+0

Спасибо, Аарон! Я просто понял это, и я пришел сюда, чтобы опубликовать ответ. Я добавил это в 'AddNoteViewController.swift', и он сработал. 'let managedObjectContext = (UIApplication.sharedApplication(). Delegate as! AppDelegate) .managedObjectContext' Я попробую ваше решение и посмотрю, что это делает. – Adrian

+0

Я пробовал это решение, и он падает. В журнале указано 'Невозможно передать значение типа MyApp.AddNoteViewController '(0x109cac5f0) в' UINavigationController '(0x10b8d2820). – Adrian

+0

@AdrianB Возможно, вы используете другой тип segue. Если это так, диспетчер представлений в режиме segue будет отличаться. Вы можете использовать 'let controller = segue.destinationViewController как! AddNoteViewController'. –

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