我认为这是一个初学者的问题。我目前有两个视图控制器:
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
做同样的事情?
修改
根据以下评论我将更新此内容以包含更多详细信息。以下是我要完成的任务:
我在两个视图控制器中都有IBActions,它将标记项附加到
markersToDelete数组。 deleteMarkers方法用于查找Core Data持久存储中的相应项并删除它们; AppDlegate在applicationDidEnterBackground或applicationWillTerminate时调用它。
这就是我想从app delegate访问两个视图控制器的原因。我开始认为可以有更好的方法来做到这一点。
答案 0 :(得分:1)
其他一些答案提出了对控制器进行实例化的方法,但由于您提到控制器是通过segue实例化的,因此它们似乎不正确。没有直接的方法来做你想做的事情,并且有充分的理由,应该很难从不相关的代码访问事物。在你非常简单的例子中,这个代码可以工作,因为已经提供了控制器:
var mainViewController = self.window!.rootViewController as! MainViewController
let mapViewController = mainViewController.presentedViewController
但我强烈反对AppDelegate
内部的这类代码,它会做很多假设,并且如果您的导航结构发生变化,将会轻易破解。更具体地说明您正在尝试实现的目标,并且您可以获得能够引导您获得更好架构的答案。
修改强>
鉴于提问者提供的新信息,这是针对更具体问题的建议解决方案:
我知道您的Core Data上下文中有Marker
个对象,并且您希望批量删除其中的一些对象。如何将bool属性添加到Marker
类,并将其设置为true以用于要删除的对象。然后,在AppDelegate
中,您获取将该属性设置为true的标记,然后删除它们。这样你就不需要保持数组,并且类之间没有耦合。
答案 1 :(得分:0)
您可以通过调用故事板ID来访问地图控制器,您需要在故事板中设置该故事板ID。然后就做:
let storyboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle())
var mapViewController = storyboard. instantiateViewControllerWithIdentifier("storyboardID") as! MapViewController
答案 2 :(得分:0)
您需要将故事板ID设置为mapViewController
。然后,您可以从appDelegate
访问它。
let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main",bundle: nil)
var destViewController : UIViewController
destViewController = mainStoryboard.instantiateViewControllerWithIdentifier("YourViewController") as! UIViewController
答案 3 :(得分:0)
您应该首先封装负责与CoreData框架API交互的代码。
创建如下所示的单例类,并仅将此类用于插入/删除/更新操作。这种方式将确保视图控制器之间的松散耦合。
您可以在任何课程中引用sharedInstance
的{{1}}。 。使用DataManager
,您可以调用与数据库操作相关的方法。
sharedInstance