如何在Swift中获得对应用程序委托的引用?

Ape*_*lus 372 swift

如何在Swift中获得对应用程序委托的引用?

最后,我想使用该引用来访问托管对象上下文.

Mic*_*lum 706

另一个解决方案是正确的,它将为您提供对应用程序委托的引用,但这不允许您访问由UIApplication的子类添加的任何方法或变量,如托管对象上下文.要解决这个问题,只需简单地转发到"AppDelegate"或者你的UIApplication子类恰好被调用.像这样:

Swift 3.x(Xcode 8引入)

let appDelegate = UIApplication.shared.delegate as! AppDelegate
let aVariable = appDelegate.someVariable
Run Code Online (Sandbox Code Playgroud)

Swift 1.2 - 2.x(Xcode 6.3引入)

let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
let aVariable = appDelegate.someVariable
Run Code Online (Sandbox Code Playgroud)

斯威夫特<1.2

let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
let aVariable = appDelegate.someVariable
Run Code Online (Sandbox Code Playgroud)

  • 如果任何人仍然遇到问题,那么针对OS X要求您导入Cocoa以便为NSApplication.sharedApplication()工作.我猜想iOS需要相同的东西. (9认同)
  • @zacjordaan使用该方法,您将获得该属性的自动完成,但它实际上不起作用.这种方式将在每次使用时创建AppDelegate类的新实例.您最好使用通过sharedApplication单例访问的委托.至于你的第二个问题,是的,你可能想要使用常数.即使您可能正在更改AppDelegate的属性,您可能也不会将指针重新分配给其他任何东西,在这种情况下,不需要变量.这完全取决于你.做什么适合您的需求. (3认同)
  • 我不想将其添加为单独的答案,而是要使用自己的方法获取AppDelegate,并在项目中同时使用Swift和Obj-c的属性。应在#ProjectName-BridgingHeader中添加#import“ AppDelegate.h” 。H” (3认同)
  • 这是两个答案中比较有用的。 (2认同)
  • 极好的建议!我错误地认为AppDelegate()是单例的,但是在考虑了您所说的内容之后,我意识到,如果是那样的话,将没有供我们以这种方式使用的sharedApplication模式。当然,如果不需要的话,我不想产生不必要的实例,因此您的常量声明将非常适合;谢谢。 (2认同)
  • 顺便说一句。-如果您不在ViewController或已经导入的其他任何工具中,请不要忘记“导入UIKit” (2认同)

Dog*_*fee 39

Swift 4.2

在Swift中,易于访问VC

extension UIViewController {
    var appDelegate: AppDelegate {
    return UIApplication.shared.delegate as! AppDelegate
   }
}
Run Code Online (Sandbox Code Playgroud)


AiO*_*OsN 23

便利建设者

在代码末尾添加AppDelegate类

斯威夫特3和4

func appDelegate() -> AppDelegate {
    return UIApplication.shared.delegate as! AppDelegate
}
Run Code Online (Sandbox Code Playgroud)

在你的班级中使用AppDelegate参考?


调用AppDelegate方法

的appDelegate().setRoot()

  • 如果能解释一下 setRoot() 的作用以及何时调用它,那就太好了。例如,可以从 ViewController 调用它吗?来自尚未设置窗口的单元测试?更多上下文就太好了。 (2认同)

Con*_*nor 17

它与Objective-C几乎相同

let del = UIApplication.sharedApplication().delegate
Run Code Online (Sandbox Code Playgroud)


jim*_*b99 17

这可以用于OS X.

let appDelegate = NSApplication.sharedApplication().delegate as AppDelegate
var managedObjectContext = appDelegate.managedObjectContext?
Run Code Online (Sandbox Code Playgroud)

  • 或者简单地'让appDelegate = NSApp.delegate作为AppDelegate` (3认同)
  • 在** Swift 4 **中:`NSApp.delegate as?AppDelegate` (2认同)
  • 更新为 swift 5* ```NSApplication.shared.delegate as?应用程序委托``` (2认同)

Pau*_*anu 12

这是Swift 2.0版本:

let delegate = UIApplication.sharedApplication().delegate as? AppDelegate
Run Code Online (Sandbox Code Playgroud)

并访问托管对象上下文:

    if let delegate = UIApplication.sharedApplication().delegate as? AppDelegate {

        let moc = delegate.managedObjectContext

        // your code here

    }
Run Code Online (Sandbox Code Playgroud)

或者,使用警卫:

    guard let delegate = UIApplication.sharedApplication().delegate as? AppDelegate  else {
        return
    }

    let moc = delegate.managedObjectContext

    // your code here
Run Code Online (Sandbox Code Playgroud)


Jav*_*ría 10

公寓从这里讲述,在我的情况下我错过了进口UIKit:

import UIKit
Run Code Online (Sandbox Code Playgroud)


Dha*_*ngh 9

SWIFT <3

在AppDelegate Class中为ex创建一个方法

func sharedInstance() -> AppDelegate{
        return UIApplication.sharedApplication().delegate as! AppDelegate
    }
Run Code Online (Sandbox Code Playgroud)

并称之为其他地方的ex

let appDelegate : AppDelegate = AppDelegate().sharedInstance()
Run Code Online (Sandbox Code Playgroud)

SWIFT> = 3.0

func sharedInstance() -> AppDelegate{
    return UIApplication.shared.delegate as! AppDelegate
}
Run Code Online (Sandbox Code Playgroud)

  • 这也可行,我喜欢sharedInstance命名的想法。谢谢! (2认同)
  • 每当您调用AppDelegate()。sharedInstance()时,您的示例仍会实例化一个新的AppDelegate对象。 (2认同)

小智 6

简单尝试一下:

斯威夫特4

// Call the method
(UIApplication.shared.delegate as? AppDelegate)?.whateverWillOccur()
Run Code Online (Sandbox Code Playgroud)

在您的AppDelegate中:

// MARK: - Whatever
func whateverWillOccur() {

    // Your code here.

}
Run Code Online (Sandbox Code Playgroud)


Sac*_*mbh 5

  1. 确保你 import UIKit

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


nyg*_*nyg 5

这是用于UIApplicationDelegate避免对AppDelegate类名进行硬编码的扩展:

extension UIApplicationDelegate {

    static var shared: Self {    
        return UIApplication.shared.delegate! as! Self
    }
}

// use like this:
let appDelegate = MyAppDelegate.shared // will be of type MyAppDelegate
Run Code Online (Sandbox Code Playgroud)


小智 5

这很简单

应用程序委托实例

let app = UIApplication.shared.delegate as! AppDelegate
Run Code Online (Sandbox Code Playgroud)

您可以使用一行语法调用方法

app.callingMethod()
Run Code Online (Sandbox Code Playgroud)

您可以使用此代码访问变量

app.yourVariable = "Assigning a value"
Run Code Online (Sandbox Code Playgroud)