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

时间:2015-06-30 15:45:05

标签: ios 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做同样的事情?

修改

根据以下评论我将更新此内容以包含更多详细信息。以下是我要完成的任务:

我在两个视图控制器中都有IBActions,它将标记项附加到
markersToDelete数组。 deleteMarkers方法用于查找Core Data持久存储中的相应项并删除它们; AppDlegate在applicationDidEnterBackground或applicationWillTerminate时调用它。

这就是我想从app delegate访问两个视图控制器的原因。我开始认为可以有更好的方法来做到这一点。

4 个答案:

答案 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