2016-03-29 53 views
-1

我設置了下面的Swift 2代碼,捕獲整個應用程序中的所有觸摸。它在觸摸發生和觸摸停止時發出警報。在UIApplication中捕獲觸及並在ViewController中調用導致錯誤的函數

我想訪問一個名爲myVC當觸摸正在發生的另一個視圖控制器兩種功能,當他們已經停止,調用函數一個funcOne()和工作的兩個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任何價值(即即一個現有的ViewController實例)。因此它總是nil,所以當你在你的代碼中引用它時,你會崩潰。

我的建議是,這個視圖控制器,在它自己的viewDidLoad,應該說

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

順便問一下,你在做什麼是一個非常糟糕的主意,這是完全沒有必要的。通過繼承UIWindow而不是UIApplication,您可以更安全地介入觸摸處理,甚至更好地通過在所有內容之前的不可見視圖在視圖控制器級別進行干預。 – matt

+0

謝謝,@Matt。我如何設置myVC的變量爲一個值? – user4806509

+0

我試過'UIWindow',但它不適用於所有手勢和觸摸組合。 'UIApplication'可以使用'print'來測試它。不過,我需要設置一個函數進入ViewController。 – user4806509

相關問題