2017-07-04 1 views
1

Ich weiß, es gibt viele Fragen zu diesem Problem in SO, aber ich habe nichts nützliches für mich gefunden.Index außerhalb des Bereichs Fehler in Swift 3

Ich mache eine App, die Bewegung auf dem Bildschirm erkennen kann. Aber Apple Gesten Recognizer sind zu präzise für meinen Gebrauch, also mache ich meine eigenen.

Es ist fast fertig und funktioniert.

Ich würde gerne Multitouch-Geste (wie Pinch) behandeln und ich muss die Richtung jedes Fingers auf dem Bildschirm bekommen, dafür dachte ich, jede Richtung in einem Array einzuschließen, damit ich sie leicht danach vergleichen werde . Aber ich bekomme diesen Indexfehler außer Reichweite, und ich weiß nicht, wo ich falsch liege. Ich bin ziemlich neu zu swift (selbstlernend seit 1 Monat), so kann es offensichtlich oder sogar ein dummer Fehler sein ...

Wenn Sie mir bitte dabei helfen könnten, würde ich mich freuen. Danke!

Hier ist mein vollständiger Code:

import UIKit 

class ViewController: UIViewController { 
//@IBOutlet weak var statusLabel: UILabel! 

@IBOutlet weak var StatusLabel: UILabel! 

var fingers = [String?](repeating: nil, count:10) 
var finger1 = [CGFloat]() 
var finger2 = [CGFloat]() 
var finger3 = [CGFloat]() 
var finger4 = [CGFloat]() 
var finger5 = [CGFloat]() 
var direction: String = "" 
var direction1 = [String]() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 

    } 

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
     super.touchesBegan(touches, with: event) 
     direction = "" 
     direction1 = [] 
     finger1 = [] 
     finger2 = [] 
     finger3 = [] 
     finger4 = [] 
     finger5 = [] 
     for touch in touches{ 
      let point = touch.location(in: self.view) 
      for (index,finger) in fingers.enumerated() { 
       if finger == nil { 
        fingers[index] = String(format: "%p", touch) 
        print("finger \(index+1): x=\(point.x) , y=\(point.y)") 
        break 
       } 
      } 
     } 
    } 

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 
     super.touchesMoved(touches, with: event) 
     for touch in touches { 
      let point = touch.location(in: self.view) 
      for (index,finger) in fingers.enumerated() { 
       if let finger = finger, finger == String(format: "%p", touch) { 
        switch (index){ 
        case 0 : 
         finger1 += [point.x, point.y] 
        case 1 : 
         finger2 += [point.x, point.y] 
        case 2 : 
         finger3 += [point.x, point.y] 
        case 3 : 
         finger4 += [point.x, point.y] 
        case 4 : 
         finger5 += [point.x, point.y] 
        default : 
         break 
        } 
       } 
      } 
     } 
    } 

    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { 
     super.touchesEnded(touches, with: event) 
     for touch in touches { 
      for (index,finger) in fingers.enumerated() { 
       if let finger = finger, finger == String(format: "%p", touch) { 
        fingers[index] = nil 
        break 
       } 
      } 
     } 
     if finger1.count != 0 { 
      direction1[0] += GestureRecognizer(coordinates: finger1, index: 0) 
     } 
     if finger2.count != 0 { 
      direction1[1] += GestureRecognizer(coordinates: finger2, index: 1) 
     } 
     if finger3.count != 0 { 
      direction1[2] += GestureRecognizer(coordinates: finger3, index: 2) 
     } 
     if finger4.count != 0 { 
      direction1[3] += GestureRecognizer(coordinates: finger4, index: 3) 
     } 
     if finger5.count != 0 { 
      direction1[4] += GestureRecognizer(coordinates: finger5, index: 4) 
     } 

     print("1 " + direction1[0] + "2 " + direction1[1] + "3 " + direction1[2] + "4 " + direction1[3] + "5 " + direction1[4]) 
     StatusLabel.text = direction1[1] 
    } 

    func GestureRecognizer (coordinates: [CGFloat], index: Int) -> String { 
     if (coordinates[0] - coordinates[coordinates.count-2]) > 100 && (coordinates[1] - coordinates[coordinates.count-1]) < (-100) { 
      print("Vers la gauche et bas") 
      direction1[0] = "downleft" 
     } 
     else if (coordinates[0] - coordinates[coordinates.count-2]) < (-100) && (coordinates[1] - coordinates[coordinates.count-1]) > 100{ 
      print("Vers la droite et haut") 
      direction1[index] = "upright" 
     } 
     else if (coordinates[0] - coordinates[coordinates.count-2]) < (-100) && (coordinates[1] - coordinates[coordinates.count-1]) < (-100){ 
      print("Vers la droite et bas") 
      direction1[index] = "downright" 
     } 
     else if (coordinates[0] - coordinates[coordinates.count-2]) > 100 && (coordinates[1] - coordinates[coordinates.count-1]) > 100 { 
      print("Vers la gauche et haut") 
      direction1[index] = "upleft" 
     } 
     else if (-100..<100).contains(coordinates[0] - coordinates[coordinates.count-2]) && (coordinates[1] - coordinates[coordinates.count-1]) > 100 { 
      print("Swipe up") 
      direction1[index] = "swipeup" 
     } 
     else if (-100..<100).contains(coordinates[0] - coordinates[coordinates.count-2]) && (coordinates[1] - coordinates[coordinates.count-1]) < -100 { 
      print("Swipe Down") 
      direction1[index] = "swipedown" 
     } 
     else if (coordinates[0] - coordinates[coordinates.count-2]) > 100 && (-100..<100).contains(coordinates[1] - coordinates[coordinates.count-1]){ 
      print("Swipe left") 
      direction1[index] = "swipeleft" 
     } 
     else if (coordinates[0] - coordinates[coordinates.count-2]) < -100 && (-100..<100).contains(coordinates[1] - coordinates[coordinates.count-1]){ 
      print("Swipe right") 
      direction1[index] = "swiperight" 
     } 
     else { 
      direction1[index] = "failed" 
     } 
     return direction1[index] 
    } 
} 
+0

Es gibt viele Arrays wurden used.please Debug-Check es zu initialisieren, wo Sie Index außerhalb des zulässigen Bereichs bekommen. –

+0

@DSDharma Du hast Recht, mein Schlechter. Dann rufe ich die Funktion GestureRecognizer in der Zeile: direction1 [index] = "Something" auf. Dort bekomme ich den Fehler. – Hawkydoky

Antwort

1

Sie sollen Ihre direction1 Array erneut prüfen. Der Fehler ist wahrscheinlich in dieser Linie sein:

print("1 " + direction1[0] + "2 " + direction1[1] + "3 " + direction1[2] + "4 " + direction1[3] + "5 " + direction1[4]) 

Sie direction1 = [] eingestellt haben und dann versucht man 5 verschiedene Elemente in Ihrem direction1 Array zu drucken.

Behelfslösung ist eine feste Größe Array [String](repeating: "", count: 5) und entfernen Sie diese Zeile direction1 = []

+0

In der Tat ist der Fehler in direction1 [index] = "Something", das ist, wo es erscheint. Wie kann ich die Richtung jedes Punktes getrennt bekommen? – Hawkydoky

+0

Ja, es ist in 'direction1 [index] =" Something ", wenn' GestureRecognizer' aufgerufen wurde. Sonst ist es in 'touchesEnded'. Überprüfen Sie meine überarbeitete Antwort. – Lawliet

+0

Es funktioniert! Vielen Dank! Ich akzeptiere deine Antwort. – Hawkydoky

Verwandte Themen