2016-03-30 1 views
0

Voici mon fichier GameViewController.m:Pourquoi mon balayage UIGestureRecognizer ne fonctionne-t-il pas? 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]; 

Voici le code correspondant dans mon fichier TwinstonesStoneView.m:

@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 

Je présente mes excuses pour la durée nécessaire (probablement), je viens d'essayer pour comprendre cela pendant quelques jours et n'ont pas eu de chance. Voici les points de ce que j'essaie de faire: 1. setInititalStateMain définit les emplacements de deux pierres dans une grille 5x5 2. Dans GameViewController.m, j'essaye de capturer le 'stoneUnoView' et 'stoneDueView' propriétés (définies dans le fichier TwinstonesStoneView.m), leur donner des gestes de balayage, et interagir avec eux en utilisant les méthodes fournies dans TwinstonesStoneView.m. 3. Est-ce que je génère trop de vues? Le hic, c'est que tout fonctionne en fonction de ce que je peux voir sur mon iPhone quand je lance le programme. Les pierres apparaissent sur mon écran, mais lorsque j'essaie d'interagir avec elles, même le message 'NSLog' n'apparaît pas dans la console. 4. La méthode 'stoneOneCreation' (et ... deux) sont UIImageView, mais, comme vous pouvez le voir, je les stocke dans un pointeur UIView.
5. J'ai également utilisé '[un setUserInteractionEnabled: YES]' (et ... deux) mais cela n'a pas aidé non plus. 6. Si j'ajoute l'outil de reconnaissance de gestes à self.view, tout fonctionne (les affichages des pierres, du plateau de jeu et d'autres graphiques apparaissent, et lorsque j'interagis avec N'IMPORTE QUELLE partie de l'écran, je donne les instructions à la console. .... juste pas interaction pierre-spécifique).

Merci beaucoup d'avoir supporté tout cela, cela aidera vraiment si quelqu'un sait ce qui ne va pas. PS: tous les fichiers # import sont corrects, donc ce n'est pas un problème.

J'utilise XCode 7, Objective-C, et le développement pour iOS

  • Anthony

Répondre

0

Une chose qui attire mon attention est que je ne pense pas que vous pouvez ajouter le même geste Recognizer à plusieurs vues. Je soupçonne, au mieux, que seule la dernière vue est en train de la recevoir.

+0

j'ai commenté l'un des points de vue de l'essayer et il ne fonctionne toujours pas. J'ai toujours pensé que vous pouviez donner le même geste à plusieurs vues, vu que les vues elles-mêmes sont des entités séparées. Merci –

+0

Je suis toujours sûr que vous ne pouvez pas réutiliser les gestes, mais vous semblez avoir éliminé cela comme un problème possible. Avez-vous activé l'interaction de l'utilisateur sur ces vues? Si c'est éteint, alors je crois que les gestes ne se déclencheront pas. – ghostatron

+0

Oui, j'ai cette ligne [un setUserInteractionEnabled: YES]; allumé et éteint. 'one' étant un TwinstonesStoneView (sous-classe de UIView), je ne sais pas pourquoi cette ligne aurait même de l'importance. –

0

essayer, mais je ne suis pas essayer que cela, il suffit de créer 2 gestes swipe dans 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 préparent le geste self qui signifie que les actions sont envoyées à GameViewController.m mais nous voulons des actions soient dans TwinstonesStoneView.m alors changez la cible pour afficher TwinstonesStoneView. Et si elle est vue d'image u ajoutons des gestes, puis activez l'interaction utilisateur pour chaque vue d'image setUserInteractionEnabled:

essayez-