2016-03-29 28 views
-1

Ich habe den folgenden Swift 2-Code eingerichtet, der alle Berührungen über die gesamte App erfasst. Es warnt, wenn Berührungen auftreten und Berührungen aufgehört haben.Erfassen von Berührungen in UIApplication und Aufruf einer Funktion in ViewController, was zu einem Fehler führt

Ich möchte auf zwei Funktionen in einem anderen Ansichtscontroller namens myVC zugreifen, wenn Berührungen auftreten und wenn sie aufgehört haben, Funktion funcOne() aufrufen und Funktion zwei funcTwo(). Allerdings bekomme ich ständig einen Fehler fatal error: unexpectedly found nil while unwrapping an Optional value. Es scheint, wenn myVC aufgerufen wird, verursacht es Fehler.

Wie kann ich erreichen, dass eine Funktion auf dem ViewController ohne Fehler aufgerufen wird und je nachdem, ob die App in Swift 2 Touch-Ereignisse empfängt oder nicht empfängt?

main.swift Datei:

import UIKit 

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

UIApplication.swift Datei:

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) 
    } 
} 

Antwort

1

Das Problem ist, dass Sie

var myVC: ViewController! 

sagen, aber Sie sind nie Einstellung, die Variable myVC einem Wert (i. e. eine vorhandene ViewController-Instanz). So ist es immer nil, und wenn Sie in Ihrem Code darauf verweisen, stürzen Sie ab.

Mein Rat wäre, dass diese View-Controller, in seinem eigenen viewDidLoad, sagen sollte

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

By the way, was Sie tun, ist eine wirklich schlechte Idee, und es ist völlig unnötig. Sie könnten sicherer in die Berührbehandlung eingreifen, indem Sie UIWindow anstelle von UIApplication abzweigen oder sogar auf der Ebene des Ansichtscontrollers durch eine unsichtbare Ansicht vor allem eingreifen. – matt

+0

Danke, @Matt. Wie kann ich eine Variable für myVC auf einen Wert setzen? – user4806509

+0

Ich habe 'UIWindow' versucht, aber es funktioniert nicht für alle Gesten und Berührungen zusammen. 'UIApplication' funktioniert jedoch mit' print' um es zu testen. Allerdings muss ich eine Funktion im ViewController einstellen. – user4806509