[英]How to do routing from AppDelegate.swift to any View controller
[英]How to access a view controller that is not the root view controller from AppDelegate.swift?
我认为这是一个初学者的问题。 我目前有两个视图控制器:
class MainViewController: UIViewController {
var markersToDelete = Marker()
func deleteMarkers() {}
}
class MapViewController: UIViewController {
var markersToDelete = Marker()
func deleteMarkers() {}
}
MapViewController
在情节提要中通过模式选择实例化。 我知道我可以使用以下代码访问AppDelegate.swift
MainViewController
:
var mainViewController = self.window!.rootViewController as! MainViewController
如何使用MapViewController
做同样的事情?
编辑
基于以下评论,我将对此进行更新以包括更多详细信息。 这是我要完成的工作:
我在两个视图控制器中都有IBAction,它们将Marker项目附加到
markersToDelete数组。 deleteMarkers方法用于在Core Data持久性存储中找到相应的项目并将其删除; 当applicationDidEnterBackground或applicationWillTerminate时,由AppDelegate调用。
这就是为什么我要从应用程序委托访问两个视图控制器的原因。 我开始认为可能会有更好的方法来做到这一点。
其他一些答案提出了使控制器失效的方法,但是由于您提到控制器是通过segue实例化的,因此它们似乎是不正确的。 没有任何直接的方法可以执行您想要的操作,并且有一个很好的理由,应该很难从无关的代码中访问内容。 在您的非常简单的示例中,假定已经介绍了控制器,则此代码将起作用:
var mainViewController = self.window!.rootViewController as! MainViewController
let mapViewController = mainViewController.presentedViewController
但是我强烈不建议在AppDelegate
这种类型的代码,它会做出很多假设,并且如果导航结构发生变化,则很容易破坏。 更具体地说明您要实现的目标,您可能会得到答案,从而使您获得更好的体系结构。
编辑
考虑到问询者提供的新信息,这是针对更具体问题的建议解决方案:
我了解您在Core Data上下文中有Marker
对象,并且希望批量删除其中一些对象。 要将一个bool属性添加到Marker
类,然后将要删除的对象设置为true,该怎么办? 然后,在AppDelegate
,获取将属性设置为true的标记,然后将其删除。 这样,您不需要维护数组,并且类之间没有耦合。
您可以通过调用情节提要ID来访问地图控制器,您需要在情节提要中对其进行设置。 然后做:
let storyboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle())
var mapViewController = storyboard. instantiateViewControllerWithIdentifier("storyboardID") as! MapViewController
您需要将Storyboard ID设置为mapViewController
。 然后,您可以从appDelegate
访问它。
let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main",bundle: nil)
var destViewController : UIViewController
destViewController = mainStoryboard.instantiateViewControllerWithIdentifier("YourViewController") as! UIViewController
您应该先封装负责与CoreData框架API交互的代码。
创建一个如下所示的单例类,并将该类仅用于插入/删除/更新操作。 这样可以确保视图控制器之间的松散耦合。
您可以在任何类中sharedInstance
对DataManager
的sharedInstance
的引用。 。 使用sharedInstance
可以调用与数据库操作相关的方法。
class DataManager {
class var sharedInstance : DataManager {
struct Singleton {
static let instance = DataManager()
}
return Singleton.instance
}
func deleteMarkers() {
//Your logic here
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.