繁体   English   中英

如何从AppDelegate.swift访问不是根视图控制器的视图控制器?

[英]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交互的代码。

创建一个如下所示的单例类,并将该类仅用于插入/删除/更新操作。 这样可以确保视图控制器之间的松散耦合。

您可以在任何类中sharedInstanceDataManagersharedInstance的引用。 使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM