2016-03-29 10 views
-1

以下のSwift 2コードをセットアップして、アプリ全体ですべてのタッチをキャプチャします。タッチが発生したときやタッチが止まったときに警告を発する。UIApplicationでタッチをキャプチャし、ViewControllerでエラーを引き起こす関数を呼び出す

私はタッチが発生しているときmyVCという名前の別のビューコントローラに二つの機能にアクセスしたいと、彼らが停止したら、機能1 funcOne()を呼び出し、2 funcTwo()が機能しています。しかし、私は継続的にエラーfatal error: unexpectedly found nil while unwrapping an Optional valueを受け取ります。 myVCが呼び出されるたびにエラーが発生するようです。

ViewControllerでエラーなしで関数を呼び出すことはできますが、アプリがSwift 2でタッチイベントを受信して​​いるか受信していないかによって、どうすればよいですか?

main.swiftファイル:

import UIKit 

UIApplicationMain(Process.argc, Process.unsafeArgv, nil, NSStringFromClass(AppDelegate)) 

UIApplication.swiftファイル:

import UIKit 

@objc(MyApplication) 

class MyApplication: UIApplication { 

var myVC: ViewController! 

    override func sendEvent(event: UIEvent) { 

     if event.type != .Touches { 
      super.sendEvent(event) 
      return 
     } 

     var touchesStarted = false 
     if let touches = event.allTouches() { 
      for touch in touches.enumerate() { 
       if touch.element.phase != .Cancelled && touch.element.phase != .Ended { 
        touchesStarted = true 
        break 
       } 
      } 
     } 

     if touchesStarted { 
    myVC.funcOne() // Call function one on ViewController 
     } else { 
    myVC.funcTwo() // Call function two on ViewController 
     } 

     super.sendEvent(event) 
    } 
} 

答えて

1

問題は、あなたが

var myVC: ViewController! 

を言っているが、あなたがいずれかに変数myVCを設定することはありませんされているということです値(すなわち、 e。既存のViewControllerインスタンス)。したがって、常にnilであるため、コード内で参照するとクラッシュします。

私のアドバイスは、このビューコントローラ、viewDidLoad自身の中で、ところで

(UIApplication.sharedApplication() as MyApplication).myVC = self 
+0

を言う必要があることになり、何をやっていることは本当に悪いアイデアであり、それは全く不要です。 UIApplicationの代わりにUIWindowをサブクラス化することで、より安全にタッチ操作に介入することができます。また、すべての目の前に目に見えないビューを使用してView Controllerのレベルに介入することもできます。 – matt

+0

ありがとう、@マット。 myVCの変数を値に設定するにはどうすればよいですか? – user4806509

+0

私は 'UIWindow'を試しましたが、すべてのジェスチャーとタッチの組み合わせでは機能しません。 'UIApplication'は' print'を使ってテストします。しかし、私はViewControllerに行く関数を設定する必要があります。 – user4806509