2017-03-23 10 views
1

のメンバー関数をAppDelegateapplicationWillResignActive関数で呼び出したいとします。そうする最善の方法は何か分かりません。私はこのようにしてみました:AppControllerのメンバー関数をAppDelegateから呼び出す

let landmark = LandmarkViewController() 
landmark.test() 

しかし、それはどういうわけか正しいとは思われません。私は本質的に既存のものを使用する代わりに、コントローラの新しいインスタンスを作成しています。

+1

これは、[通知センター](https://developer.apple.com/reference/foundation/nsnotificationcenter)を介して通知を送信するには良い場所かもしれません。あなたの 'LandmarkViewController'がオブザーバーになることができます。 – hola

+0

ストーリーボードを使用していますか?はい、これはあなたが探しているの[回答](http://stackoverflow.com/questions/41136597/create-singleton-of-a-viewcontroller-in-swift-3/41136939#41136939)です:) –

答えて

6

あなたが望むものを達成する最良の方法は、この通知のためにオブザーバーをビューコントローラー自体に設定することだと思います。UIApplicationWillResignActiveNotification

override func viewDidLoad() { 
    super.viewDidLoad() 
    let notificationCenter = NotificationCenter.default 
    notificationCenter.addObserver(self, selector: #selector(appDidResign), name: Notification.Name.UIApplicationWillResignActive, object: nil) 
} 

func appDidResign() { 
    // do your stuff 
} 

deinit { 
    NotificationCenter.default.removeObserver(self) //always remember to remove any observers (you can do this in deinit in this case) 
} 
+0

これはOPが求めているものではないと思う、とにかくそれはgooアプローチかもしれない... –

+0

それは本当だ。私はOPが通知を意識していないので、OPがこれを求めていると思うが: – tanzolone

+0

通知を送信することに関連するコードを追加することをお勧めします。 –

0

はい、上記のコードは新しいインスタンスを作成します。既存のインスタンスを使用する場合は、既存のインスタンスへの参照を何らかの形で取得する必要があります。

参照の取得方法は、View Controllerの設定方法によって異なります。たとえば、LandmarkViewControllerがルートビューコントローラの場合は、おそらくUIWindow経由で取得できます。または、LandmarkViewControllerインスタンスが作成されると、View Controllerへの参照をアプリケーションデリゲートに渡すことができます。それはあなたのアプリの設定方法によって異なります。

+0

これはコメントにする必要があります –

+0

コメントである必要がありますか?私は彼の質問に答えていた: – Fahim

0

あなたはUIWindowから(あなたのLandmarkViewControllerは、私が理解する方法である)rootViewControllerを取得することができます:

if let rootViewController = self.window?.rootViewController as LandmarkViewController { 
    rootViewController.test() 

} 
0

私は最善の方法は、このクラスに通知のオブザーバを追加していると思います。 いくつかは、このように考える:

class LandmarkViewController: ... 
{ 
    ... 
    func viewDidLoad() 
    { 
     ... 
     NotificationCenter.default.addObserver(forName: applicationWillResignActive, object: nil, queue: OperationQueue.main) { (notification) in 
      ... 
     } 
    } 
} 
関連する問題