第二个视图中的AppDelegate声明

时间:2015-11-28 18:17:56

标签: ios swift core-data appdelegate

我的应用程序存在问题,也许是管理AppDelegate的方法。 我有2个视图,一个是主视图,第二个是设置。 我的第一个视图将访问我的核心数据(7个字符串中的IP地址)。当进入第二个视图时,我想将IP地址修改为我的CoreData。 我当然可以在第一个视图中访问我的数据,然后将(segue)发送到第二个视图。 我的问题是,我想从第二个视图更改我的IP地址并将其保存到我的核心数据中。 我知道如何保存,....但是,我需要创建一个ManagedObject,但是,为此,我需要一个AppDelegate。 但是,似乎我的AppDelegate声明不起作用。我的意思是,Xcode告诉我AppDelegate是未申报的。

我可以将AppDelegate从第一个视图转到第二个视图吗? 要么 如何在我的SecondView中创建AppDelegate?

提前感谢您的帮助和支持。

2 个答案:

答案 0 :(得分:1)

如果我理解正确,您想从另一个ViewController访问您的应用代理?

就这样做:

let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate

答案 1 :(得分:0)

正如Wain所建议的那样,最佳做法是让主视图控制器将托管对象上下文传递给设置视图控制器。

这称为依赖注入,这是你如何通过segue进行的:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "showSettings" {
        if let destinationVC = segue.destinationViewController as? SettingsViewController{
            // Pass our managed object context to the settings controller
            destinationVC.managedObjectContext = managedObjectContext
        }
    }
}

您可以在“设置”视图控制器中添加managedObjectContext属性,如下所示:

import CoreData

class SettingsViewController: UIViewController {

    var managedObjectContext : NSManagedObjectContext?

依赖注入的好处是每个视图控制器只使用它给出的上下文,而不是寻找已知的"放置全局托管对象上下文(例如AppDelegate)。

这消除了视图控制器与AppDelegate之间的紧密耦合,并且还使您可以灵活地在整个应用中使用多个NSManagedObjectContext,这通常会随着项目规模和复杂性的增加而变得非常重要

Apple在其Accessing the Core Data Stack文档中推荐了这种做法:

  

创建视图控制器时,您应该传递它应该的上下文   使用。您传递现有上下文,或(在您想要的情况下)   用于管理离散编辑集的新控制器)新的上下文   你为它创造的。这通常是责任   应用程序委托创建传递给第一个视图的上下文   显示的控制器。

     

视图控制器通常不应从a检索上下文   全局对象,例如应用程序委托 - 这使得   应用程序架构僵化。

<强>更新

在回答有关如何创建NSManagedObject的评论时,您只需要NSManagedObjectContext,这是您的第二个视图控制器现在拥有的。

let employee = NSEntityDescription.insertNewObjectForEntityForName("Employee", inManagedObjectContext: self.managedObjectContext) as! Employee

有关详细信息,请参阅Apple的核心数据编程指南中的Creating and Saving Managed Objects

您的视图控制器都不需要访问AppDelegate,因为您现在正在传递一个上下文供他们使用。