2015-06-30 8 views
0

Я думаю, что это вопрос для начинающих. Я в настоящее время есть два контроллера Вид:Как получить доступ к контроллеру представления, который не является контроллером корневого представления из AppDelegate.swift?

class MainViewController: UIViewController { 
    var markersToDelete = Marker() 
    func deleteMarkers() {} 
} 

class MapViewController: UIViewController { 
    var markersToDelete = Marker() 
    func deleteMarkers() {} 
} 

MapViewController создается с помощью модального Segue в раскадровке. Я знаю, что я могу получить доступ MainViewController в AppDelegate.swift с этим кодом:

var mainViewController = self.window!.rootViewController as! MainViewController 

Как я могу сделать то же самое с MapViewController?

EDIT

На основе комментариев ниже я обновляемое это включить более подробно. Вот что я пытаюсь выполнить:

У меня есть IBActions в обоих контроллерах представлений, которые добавляют элементы маркера к
markersToDelete array. Метод deleteMarkers используется для поиска соответствующих элементов в постоянном хранилище основных данных и их удаления; он вызывается AppDelegate, когда applicationDidEnterBackground или когда applicationWillTerminate.

Именно по этой причине я хочу получить доступ к обоим контроллерам представлений из делегата приложения. Я начинаю думать, что может быть лучший способ сделать это.

ответ

1

Некоторые другие ответы предложить способы insantiating контроллера, но они, кажется неправильным, так как вы упомянули контроллер конкретизируется через Segue. Нет прямого способа сделать то, что вы хотите, и по уважительной причине трудно получить доступ к вещам из несвязанного кода. В вашем очень простом примере, этот код будет работать, учитывая контроллеры уже были представлены:

var mainViewController = self.window!.rootViewController as! MainViewController 
let mapViewController = mainViewController.presentedViewController 

Но я бы сильно обескуражить этот тип кода внутри AppDelegate, он делает много предположений и легко ломается, если ваш изменения структуры навигации. Более конкретно о том, чего вы пытаетесь достичь, и вы можете получить ответы, которые приведут вас к лучшей архитектуре.

EDIT

Учитывая новую информацию, представленную спрашивающего, это предложенное решение более конкретной задачи:

Я понимаю, у вас есть Marker объекты в контексте ядра данных, и вы хотите для пакетного удаления некоторых из них. Как насчет добавления свойства bool в класс Marker и установки его для объектов, которые вы хотите удалить. Затем, в AppDelegate, вы получите маркеры, у которых это свойство установлено значение true, и удалите их. Таким образом, вам не нужно создавать массив, и между классами не существует связи.

+0

Почему downvote? Я новичок в stackoverflow, как это плохой ответ? –

+0

Я думаю, что ваш ответ является единственным правильным до сих пор. Другие создают новые контроллеры представлений, а не те, которые находятся на раскадровке, поэтому они полностью отличаются от контроллера вида на раскадровке. – sylvanaar

+0

@ LeonardoYvens Я обновил свой вопрос, чтобы включить более подробные сведения, чтобы показать вам, что я пытаюсь выполнить , – flightsimmer668

0

Вы можете получить доступ к контроллеру карты, называя его идентификатор раскадровки, который вам нужно установить в раскадровке. Тогда просто сделать:

let storyboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle()) 
var mapViewController = storyboard. instantiateViewControllerWithIdentifier("storyboardID") as! MapViewController 
+0

Будет ли это выполнено то же самое? var mapViewController = MapViewController() – flightsimmer668

+0

no. Тот, который вы только что написали, только создаст экземпляр вашего класса, у него не будет ничего, что вы создали в Storyboard. – scott

0

Вам нужно установить раскадровки идентификатор вашего mapViewController. Затем вы можете получить к нему доступ от appDelegate.

let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main",bundle: nil) 
var destViewController : UIViewController 
destViewController = mainStoryboard.instantiateViewControllerWithIdentifier("YourViewController") as! UIViewController 
0

Вы должны начать с инкапсуляции кода, который отвечает за взаимодействие с API-интерфейсом CoreData.

Создайте класс singleton, как показано ниже, и используйте этот класс только для операций вставки/удаления/обновления. Этот способ обеспечит свободное соединение между контроллерами вашего вида.

Вы можете получить ссылку на sharedInstance от DataManager в любом классе. , Используя sharedInstance, вы можете вызывать методы, связанные с вашими операциями с базой данных.

class DataManager { 
     class var sharedInstance : DataManager { 
      struct Singleton { 
       static let instance = DataManager() 
      } 
      return Singleton.instance 
    } 
    func deleteMarkers() { 
    //Your logic here 
} 
    } 
Смежные вопросы