2016-03-30 18 views
0

Hier ist meine GameViewController.m Datei:Warum funktioniert mein UIGestureRecognizer Swipe nicht? Xcode

- (void)viewDidLoad { 
     [super viewLoad]; 
     . 
     . 
     . 
     _board = [[TwinstonesBoardModel alloc] init]; 
     [_board setToInitialStateMain]; 
     TwinstonesStoneView* twinstonesBoard = [[TwinstonesStoneView alloc] 
              initWithMainFrame:CGRectMake(12, 160, 301.5, 302.5) 
              andBoard:_board]; 
     [self.view addSubview:twinstonesBoard]; 

     TwinstonesStonesView *stoneOne = [[TwinstonesStoneView alloc] init]; 
     TwinstonesStonesView *one = (TwinstonesStoneView*)stoneOne.stoneUnoView; 
     TwinstonesStonesView *stoneTwo = [[TwinstonesStoneView alloc] init]; 
     TwinstonesStonesView *two = (TwinstonesStoneView*)stoneTwo.stoneDueView; 

     UISwipeGestureRecognizer* swipeLeft = [[UISwipeGestureRecognizer alloc] 
              initWithTarget:self 
              action:@selector(swipeLeft:)]; 
     swipeLeft.direction = UISwipeGestureRecognizerDirectionLeft; 
     swipeLeft.numberOfTouchesRequired = 1; 
     [one addGestureRecognizer:swipeLeft]; 
     [two addGestureRecognizer:swipeLeft]; 

Hier ist der relevante Code in meiner TwinstonesStoneView.m Datei:

@implementation TwinstonesStoneView 
    { 
     NSMutableArray* _array; 
     NSMutableArray* _emptyArray; 
     CGRect _frame; 
     NSUInteger _column; 
     NSUInteger _row; 
     TwinstonesBoardModel* _board; 

     int _i; 
    } 

    - (id)initWithMainFrame:(CGRect)frame andBoard: 
             (TwinstonesBoardModel*)board 
    { 
     if (Self = [super initWithFrame:frame]) 
     { 
     float rowHeight = 49.0; 
     float columnWidth = 49.0; 
     float barrierHorizontalRowHeight = 12.5; 
     float barrierVerticalColumnWidth = 12.5; 

     for (int row = 0; row < 5; row++) 
     { 
      for (int col = 0; col < 5; col++) 
      { 
      TwinstonesStonesView* square = [[TwinstonesStoneView alloc] 
       initWithEmptyFrame:CGRectFrame(//spacial equations, not important) 
       column:col 
       row:row 
       board:board]; 

      BoardCellState state = [board cellStateAtColumn:col andRow:row]; 

      if (state == BoardCellStateStoneOne) { 
       // _stoneUnoView is a public property 
       // 'stoneOneCreation' creates a UIImageView of the stone 
       _stoneUnoView = [UIImageView stoneOneCreation]; 
       [self addSubview:square]; 
       [square addSubview:_stoneUnoView]; 
       [_array insertObject:_stoneUnoView atIndex:0]; 
      } else if (state == BoardCellStateStoneTwo) { 
       // same idea as above 
       _stoneDueView = [UIImageView stoneTwoCreation]; 
       [self addSubview:square]; 
       [square addSubview:_stoneDueView]; 
       [_array insertObject:_stoneDueView atIndex:1]; 
      } else { 
       // based on the 'init' method I write below, I assumed this 
       // would return an empty square cell 
       [self addSubview:square]; 
       [_emptyArray insertObject:square atIndex:_i]; 
       _i++; 
      } 
      } 
     } 
     self.backgroundColor = [UIColor clearColor]; 
     } 
     return self; 
    } 

    - (UIView*)stoneUnoView { 
     return _stoneUnoView; 
    } 

    - (UIView*)stoneDueView { 
     return _stoneDueView; 
    } 

    - (id)initWithEmptyFrame:(CGRect)frame 
         column:(NSUInteger)column 
         row:(NSUInteger)row 
         board:(TwinstonesBoardModel*)board 
    { 
     self = [super initWithFrame:frame]; 
     return self; 
    } 

    - (void)swipeLeft:(UIGestureRecognizer*)recognizer 
    { 
     NSLog(@"Swipe Left"); 
     UIView* view = recognizer.view; 
     [self move:CGPointMake(-1, 0) withView:view]; 
    } 

    - (void)move:(CGPoint)direction withView:view { 
     // whatever code I decide to put for stone movement 
    } 

    @end 

ich für die (wahrscheinlich) unnötige Länge zu entschuldigen, ich habe nur versucht, Das herauszufinden für ein paar Tage und hatte kein Glück. Hier sind die Aufzählungspunkte von dem, was ich versuche zu tun: 1. setInitialStateMain setzt die Platzierungen von zwei Steinen in einem 5x5 Raster 2. In GameViewController.m versuche ich die 'stoneUnoView' und 'stoneDueView' zu erfassen Eigenschaften (in der Datei TwinStonesStoneView.m festgelegt), geben Sie Swipe-Gesten und interagieren Sie mit ihnen mit den Methoden in TwinstonesStoneView.m bereitgestellt. 3. Generiere ich zu viele Ansichten? Der Haken dabei ist, dass alles so funktioniert, wie ich es auf meinem IPhone sehen kann, wenn ich das Programm starte. Die Steine ​​erscheinen auf meinem Bildschirm, aber wenn ich versuche, mit ihnen zu interagieren, wird nicht einmal die Meldung "NSLog" in der Konsole angezeigt. 4. Die 'stoneOneCreation'-Methode (und ... zwei) sind UIImageView's, aber wie Sie sehen können, speichere ich sie in einem UIView-Zeiger.
5. Ich habe auch '[setUserInteractionEnabled: YES]' (und ... zwei) verwendet, aber das hat auch nicht geholfen. 6. Wenn ich den Gestenerkenner zu self.view hinzufüge, funktioniert alles (die Anzeigen der Steine, des Spielbretts und anderer Grafiken erscheinen, und wenn ich mit JEDEM Teil des Bildschirms interagiere, gebe ich die Anweisungen an die Konsole aus .. .... einfach nicht steinspezifische Interaktion).

Vielen Dank, dass Sie sich mit all dem abfinden, das wird wirklich helfen, wenn jemand weiß, was los ist. PS: alle Datei # Importe sind korrekt, das ist also kein Problem.

Ich bin mit XCode 7, Objective-C-Sprache und die Entwicklung für iOS

  • Anthony

Antwort

0

Eine Sache, die mein Auge fällt ist Ich glaube nicht, dass Sie die gleiche Geste hinzufügen Erkenner für mehrere Ansichten. Ich vermute, im besten Fall wird nur die letzte Ansicht empfangen.

+0

ich aus einer der Ansichten kommentiert, es auszuprobieren und es immer noch nicht funktioniert. Ich dachte immer, du könntest die gleiche Geste mehreren Ansichten geben, da die Ansichten selbst separate Einheiten sind. Danke –

+0

Ich bin immer noch ziemlich sicher, dass Sie Gesten nicht wiederverwenden können, aber Sie scheinen das als ein mögliches Problem entfernt zu haben. Haben Sie eine Benutzerinteraktion für diese Ansichten aktiviert? Wenn es ausgeschaltet ist, glaube ich, dass die Gesten nicht ausgelöst werden. – ghostatron

+0

Ja, ich habe diese Zeile [one setUserInteractionEnabled: YES]; an und aus. "Eins" ist eine TwinStonesStoneView (Unterklasse von UIView), also weiß ich nicht, warum diese Zeile überhaupt eine Rolle spielt. –

0

versuchen, dies aber ich bin nicht sicher, ob dies versuchen, erstellen Sie einfach 2 Swipe-Gesten in GameViewController.m

- (void)viewDidLoad { 
    [super viewLoad]; 
    //.... other code 
    //comment below line 
    // UISwipeGestureRecognizer* swipeLeft = [[UISwipeGestureRecognizer alloc] 
            //initWithTarget:self //setting self is the problem is the problem 
            //action:@selector(swipeLeft:)]; 
    UISwipeGestureRecognizer* swipeLeft = [[UISwipeGestureRecognizer alloc] 
           initWithTarget:stoneOne //set target will be one 
            action:@selector(swipeLeft:)]; 
    swipeLeft.direction = UISwipeGestureRecognizerDirectionLeft; 
    swipeLeft.numberOfTouchesRequired = 1; 

    [one addGestureRecognizer:swipeLeft]; 

    UISwipeGestureRecognizer* swipeLeft_2 = [[UISwipeGestureRecognizer alloc] 
          initWithTarget:stoneTwo //this will be two 
          action:@selector(swipeLeft:)]; 
    swipeLeft.direction = UISwipeGestureRecognizerDirectionLeft; 
    swipeLeft.numberOfTouchesRequired = 1; 

    [two addGestureRecognizer:swipeLeft_2]; //set the gesture 
} 

u die Geste zu self setzen, was bedeutet, die Aktionen zu GameViewController.m gesendet werden, aber wir wollen Aktionen sein Ändern Sie in TwinstonesStoneView.m das Ziel so, dass es in TwinstonesStoneView angezeigt wird. Und auch wenn es Bildansichten ist u Gesten hinzufügen, dann Interaktion mit dem Benutzer für jede Bildansichten setUserInteractionEnabled:

probieren Sie es einfach ermöglichen