无法转换“AppName.AppDelegate”类型的值 [重复]

Posted

技术标签:

【中文标题】无法转换“AppName.AppDelegate”类型的值 [重复]【英文标题】:Could not cast value of type 'AppName.AppDelegate' [duplicate] 【发布时间】:2019-03-12 16:47:24 【问题描述】:

我有一个名为 mapViewController 的 ViewController。在那个控制器里面我有一个按钮,它是一个播放按钮。如果单击按钮,名为“Play”的布尔值将从 false 变为 true。

让我们跳到这个线程的重点:

按下按钮后,我希望将布尔值更改为 true。如果用户离开应用程序。 (进入背景)我想打印一个显示它的文本。 (一旦我知道它是如何工作的,我就会将它用于其他目的。)

那么,让我们看看我的AppDelegate

func applicationDidEnterBackground(_ application: UIApplication)
    
        // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
        // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.

        let mapVC = UIApplication.shared.delegate as! MapViewController

        if (mapVC.play == true)
        
            print("The play-bool is true, and application did enter the background")
        


    

一旦我按下按钮并离开应用程序,我就会收到如下所示的错误:

无法将“MyDogwalk.AppDelegate”(0x28093e230) 类型的值转换为“MyDogwalk.MapViewController”(0x104f99d98)。

警告:无法执行支持代码来读取 Objective-C 类数据 进行中。这可能会降低类型信息的质量 可用。

正如您在我的代码中看到的,我正在尝试从 ViewController 中获取一个布尔值,并在我的 AppDelegate 中检查它的语句。

一旦手机在后台,我将使用此信息来跟踪位置,但这是我第一次。我需要/想了解这实际上是如何工作的,以及我该如何做到这一点。

【问题讨论】:

无关,但您可以只使用if mapVC.play 您希望如何从 App Delegate 获取 MapViewController? UIApplication.shared.delegate 将返回当前的 AppDelegate,即您当前所在的班级。 首先:您不能将委托转换为 UIViewController (delegate as! MapViewController),这显然是不正确的。第二:是MapViewController 根还是可见视图控制器?此外,我鼓励避免从AppDelegate 访问视图控制器,检查:***.com/questions/24675907/… @TomQDRS 我什么都不期待。我尝试了一些方法,但找不到一个好的答案。所以这就是我现在的位置。而且我不知道代码会返回当前的 AppDelegate,否则我不会使用那种代码。对不起。 :) 这毫无意义:let mapVC = UIApplication.shared.delegate as! MapViewController。您的应用委托是 AppDelegate,不是 MapViewController。你想用那条线做什么? 【参考方案1】:

请不要尝试从AppDelegate 访问控制器,这不是它的预期目的。

如果您将当前的ViewController 注册到正确的NSNotification,您可以检查应用程序是否会从任何地方进入后台。然后,您将定义一个在 App 进入后台状态时执行的函数,您将能够在其中打印出您的文本。

请查看https://***.com/a/9012734/4442731 了解如何执行此操作。快速解决方案在链接答案下方的答案中。此代码需要在您的MapViewController 中。

【讨论】:

或者这个:***.com/a/51589649/5501940 ;) 那么,你的意思是:我不需要在 AppDelegate 中做这种事情吗?我可以在我的 MapViewController 中做到这一点吗?那是对的吗?只是一个问题:我应该什么时候在 AppDelegate 中做一些事情? @Putte 好吧,这真的取决于你的意思是什么“东西”。如果您打算使用其他控制器中播放按钮设置的boolean,则应将其保存为例如UserDefaults,就像罗伯特的回答所建议的那样,或者一个单例对象。任何依赖于UIViewController 状态的事情都应该在所述控制器内完成。 AppDelegate 可用于基本操作,无论控制器状态如何,重要的应用事件(如启动)都会发生。【参考方案2】:

也许你应该重新考虑你的应用程序:

一种方法是为某些Notification 名称添加观察者,例如UIApplication.didEnterBackgroundNotification。因此,您会在 UIViewController 类中注意到您的应用进入后台 或者如果play是应该存储的东西,你可以使用UserDefaultsFileManager或者一些数据库来存储这个值,然后你可以在applicationDidEnterBackground(_:)中检索这个值

【讨论】:

问题是,我以后不打算打印一些东西了。我现在才完成它,直到我知道如何执行我需要的东西。稍后,我将在后台检索用户的当前位置(一旦按下该按钮),当我重新进入应用程序时,我需要它来更新当前数组并插入新的值,我将能够用于绘制折线。

以上是关于无法转换“AppName.AppDelegate”类型的值 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

为啥强制转换和转换操作在语法上无法区分?

foreach 循环无法转换,但手动转换和 for 循环工作

无法转换 'const ScalarMultipleReturnType 错误

Pdf转换成word添加图片无法显示,求解?

SWIG 无法正确转换 typedef 类型

无法从 'char[]' 转换为 'string[]' [关闭]