第二个视图中的 AppDelegate 声明

Posted

技术标签:

【中文标题】第二个视图中的 AppDelegate 声明【英文标题】:AppDelegate declaration in a second view 【发布时间】:2015-11-28 18:17:55 【问题描述】:

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

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

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

【问题讨论】:

上下文不应该由应用委托拥有(研究原因),但无论如何都要在视图控制器之间传递上下文,不要直接到应用委托。 【参考方案1】:

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

就这样做吧:

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

【讨论】:

是的,我已经在我的第二个控制器中尝试了这个,但是,Xcode 说 AppDelegate 是未知的 嗯...但是您可以像这样从第一个控制器访问它吗?这绝对是奇怪的......【参考方案2】:

按照 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 文档中推荐了这种做法:

当你创建一个视图控制器时,你将它应该传递给它的上下文 采用。你传递一个现有的上下文,或者(在你想要的情况下 新的控制器来管理一组离散的编辑)一个新的上下文 你为它创造的。这通常是由 应用程序委托创建上下文以传递给第一个视图 显示的控制器。

视图控制器通常不应该从 全局对象,例如应用程序委托——这使得 应用架构僵化。

更新:

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

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

请参阅 Apple 的 Core Data Programming Guide 中的 Creating and Saving Managed Objects 了解更多详情。

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

【讨论】:

谢谢,还有一个问题。我成功地 segue ManagedObjectContext,但是,在我的第二个观点中,对于我的实体的值更新,我如何在没有 AppDelegate 的情况下创建 ManagedContext ? 您不需要 AppDelegate。如果您正在学习使用 AppDelegate 访问上下文或创建托管对象的教程,您应该找到不同的教程 :) 我已经用示例和链接更新了答案。 谢谢,在您的示例中,当我使用地址时,您使用的是员工。老实说,我有点迷茫,因为它似乎无法访问。我需要在我的第二个视图中创建这个类吗?类地址:NSManagedObject 感谢 PetahChristian,抱歉。 @fred 没问题。发布代码有很大的不同。它向人们展示了您的尝试,并且更容易理解问题并提供解决方案。您应该显示您的 segue 代码,以便我们可以看到您传递给 Settings 视图控制器的内容、您尝试创建托管对象的 Settings 代码以及 Xcode 提供的特定错误。

以上是关于第二个视图中的 AppDelegate 声明的主要内容,如果未能解决你的问题,请参考以下文章

第二个屏幕中的标签栏控制器[重复]

UITabBar 自定义背景图像应用于一个视图控制器而不是 AppDelegate

导航控制器在第二个视图控制器中为零

NSUserDefaults 不起作用

使用协议应用程序崩溃 ipad

导航控件和其他控件是不是必须在 appDelegate 中?