Как получить ссылку на делегата приложения в Swift?

320

Как мне получить ссылку на делегат приложения в Swift?

В конечном счете, я хочу использовать ссылку для доступа к контексту управляемого объекта.

  • 6
    Обратите внимание, что некоторые считают использование делегата приложения в качестве контейнера для контекста управляемого объекта или других «глобальных» объектов антипаттерном. Подумайте о том, чтобы делегат приложения передавал MOC контроллеру, а не заставлял контроллер его находить.
  • 0
    @KristopherJohnson Эй, Крис, как я могу упростить внедрение зависимостей AppDelegate в контроллеры представлений? Инстанцировать контроллер представления программно и использовать рефлексию, чтобы решить, что создавать / вводить рекурсивно? Существуют ли рамки, которые могут помочь с этим? Если мне придется делать это вручную для каждого контроллера представления, мой AppDelegate будет огромным! Ох, желательно без создания фабрики для всего :)
Показать ещё 2 комментария
Теги:

16 ответов

615
Лучший ответ

Другое решение верно в том смысле, что оно предоставит вам ссылку на делегат приложения, но это не позволит вам получить доступ к любым методам или переменным, добавленным вашим подклассом UIApplication, например, к контексту управляемого объекта. Чтобы решить эту проблему, просто отключите приложение "AppDelegate" или когда-нибудь ваш подкласс UIApplication будет вызван. Например:

Swift 3.x(введен с Xcode 8)

let appDelegate = UIApplication.shared.delegate as! AppDelegate
let aVariable = appDelegate.someVariable

Swift 1.2 - 2.x(введено с Xcode 6.3)

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

Swift < 1.2

let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
let aVariable = appDelegate.someVariable
  • 7
    В случае, если у кого-то все еще есть проблемы, нацеливание на OS X требует, чтобы вы импортировали Какао, чтобы это работало для NSApplication.sharedApplication (). Я предполагаю, что iOS потребуется эквивалент.
  • 1
    Это более полезный из двух ответов.
Показать ещё 14 комментариев
28

В Swift легко получить доступ к вашим VC

extension UIViewController {
    var appDelegate:AppDelegate {
        return UIApplication.sharedApplication().delegate as! AppDelegate
    }
}
15

Конструкторы удобств

Добавить в класс AppDelegate в конце кода

Swift 3 и 4

func appDelegate () -> AppDelegate
{
    return UIApplication.shared.delegate as! AppDelegate
}

Использовать ссылку AppDelegate в своем классе?


Вызвать метод AppDelegate

AppDelegate(). SetRoot()

14

Это почти так же, как в Objective-C

let del = UIApplication.sharedApplication().delegate
12

Это можно использовать для OS X

let appDelegate = NSApplication.sharedApplication().delegate as AppDelegate
var managedObjectContext = appDelegate.managedObjectContext?
  • 2
    Или просто let appDelegate = NSApp.delegate as AppDelegate
  • 0
    В Swift 3 используйте let appDelegate = NSApplication.shared().delegate as AppDelegate
Показать ещё 1 комментарий
11

Вот версия Swift 2.0:

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

И для доступа к контексту управляемого объекта:

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

        let moc = delegate.managedObjectContext

        // your code here

    }

или, используя охрану:

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

    let moc = delegate.managedObjectContext

    // your code here
9

Appart из того, что сказано здесь, в моем случае я пропустил импорт UIKit:

import UIKit
8

SWIFT < 3

Создайте метод в классе AppDelegate для ex

func sharedInstance() -> AppDelegate{
        return UIApplication.sharedApplication().delegate as! AppDelegate
    }

и назовем его где-нибудь еще для ex

let appDelegate : AppDelegate = AppDelegate().sharedInstance()

SWIFT >= 3.0

func sharedInstance() -> AppDelegate{
    return UIApplication.shared.delegate as! AppDelegate
}
  • 1
    это также работает, и мне нравится идея именования sharedInstance. Спасибо!
  • 1
    Ваш пример будет по-прежнему создавать новый объект AppDelegate каждый раз, когда вы AppDelegate().sharedInstance()
Показать ещё 4 комментария
4

Попробуйте просто это:

Swift 4

// Call the method
(UIApplication.shared.delegate as? AppDelegate)?.whateverWillOccur()

где в вашем AppDelegate:

// MARK: - Whatever
func whateverWillOccur() {

    // Your code here.

}
4

1) Убедитесь, что вы import UIKit

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

3

Здесь расширение для 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
1

это очень просто

Экземпляр делегата приложения

let app = UIApplication.shared.delegate as! AppDelegate

Вы можете вызвать метод с синтаксисом в одну строку

app.callingMethod()

вы можете получить доступ к переменной с помощью этого кода

app.yourVariable = "Assigning a value"
1

Я использую это в Swift 2.3.

1.в классе AppDelegate

static let sharedInstance: AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate

2.Call AppDelegate с

let appDelegate = AppDelegate.sharedInstance
1

В моем случае я отсутствовал import UIKit поверх моего подкласса NSManagedObject. После его импорта я мог удалить эту ошибку, поскольку UIApplication является частью UIKit

Надеюсь, что это поможет другим!!!

0

В Swift 3.0 вы можете получить ссылку appdelegate на

let appDelegate = UIApplication.shared.delegate as! AppDelegate
0

В XCode 6.2 это также работает

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

let aVariable = appDelegate.someVariable
  • 1
    v01d, откуда ты это взял?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню