Swift: Как получить доступ к переменной AppDelegate с контроллера View?

Я хотел бы написать в текстовом или csv (предпочтительно) файл переменную из контроллера вида.

Действительно, я делаю приложение для рисования, и я бы хотел записать в файл текущую позицию пальца.

class ViewController: UIViewController {var lastPoint = CGPoint.zeroPoint ... }

Я хотел бы иметь доступ к lastPoint.x и lastPoint.y из AppDelegate. как я мог это сделать? Спасибо.

Ответ 1

Ваш вопрос полон путаницы, но если это то, что вы ищете:

Вы можете получить доступ к appDelegate, получив ссылку на него следующим образом:

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

после этого, если у вас есть свойство, называемое lastPoint в приложении appDelegate, вы можете легко получить доступ к его компонентам:

let x = appDelegate.lastPoint.x
let y = appDelegate.lastPoint.y

Если вам нужно получить доступ к свойствам viewController из AppDelegate, то я предлагаю иметь ссылку на ваш контроллер представления в вашем appdelegate:

var myViewController: ViewController!

то, когда ваш контроллер просмотра создан, вы можете сохранить ссылку на него в свойстве appdelegate:

Если вы создаете свой контроллер просмотра вне вашего приложения appDelegate:

Синтаксис Swift 1-2

var theViewController = ViewController()
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
appDelegate.myViewController = theViewController

Синтаксис Swift 3-4

var theViewController = ViewController()
let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.myViewController = theViewController

Если вы создаете свой контроллер просмотра внутри своего приложения appDelegate:

self.myViewController = ViewController()

После этого вы можете получить доступ к своим данным из вашего диспетчера view из вашего приложения appdelegate, просто получив доступ к его свойству:

let x = self.myViewController.lastPoint.x
let y = self.myViewController.lastPoint.y

Ответ 2

Обновление Swift 3

    var theViewController = ViewController()
    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    appDelegate.myViewController = theViewController

Ответ 3

Вы можете создать BaseViewController и написать это

class BaseViewController {
  lazy var appDelegate : AppDelegate {
     return UIApplication.shared.delegate as? AppDelegate
  }
}

и наследовать другие контроллеры вида с BaseViewController и получить к нему доступ

class ViewController : BaseViewController {

override func viewDidLoad() {
    super.viewDidLoad()
    print(self.appDelegate?.lastPoint.x)
    print(self.appDelegate?.lastPoint.x)
}}

Ответ 4

Мне удалось получить доступ к моему ViewController из делегата приложения, создав экземпляр ViewController в AppDelegate.swift, например:

var mainViewController = ViewController()

func applicationWillEnterForeground(_ application: UIApplication) {
    mainViewController.myVariable = "Hello".
}

Тем не менее, я не понимаю, как AppDelegate "знает", что mainViewController должен указывать на этот конкретный ViewController. Поскольку мое приложение имеет один вид и один ViewController, это прекрасно, но что у меня было несколько ViewControllers, связанных с различными UIViews? Цените, если кто-то здесь может пролить свет на это. С наилучшими пожеланиями, Andre