21 votes

l'utilisation de l'achèvement avec animateWithDuration provoque exc_bad_access

J'essaie d'animer 2 boutons UIButtons dans un UITableViewCell appelés addToPlaylist et removeFromPlayList (ils s'animent vers la droite après avoir été glissés dessus) et j'utilise un bloc comme suit

[UIView animateWithDuration:0.25 animations:^{

    self.addToPlaylist.center      = CGPointMake(contentsSize.width + (buttonSize.width / 2), (buttonSize.height / 2));
    self.removeFromPlaylist.center = CGPointMake(contentsSize.width + (buttonSize.width / 2), (buttonSize.height / 2));
    myImage.alpha = 1.0;

}
 completion:^ (BOOL finished) 
 {
     if (finished) {
         // Revert image view to original.
         NSLog(@"Is completed");
         self.addToPlaylist.hidden       = YES;
         self.removeFromPlaylist.hidden  = YES;
         self.hasSwipeOpen               = NO;
     }
 }];

sur l'achèvement, je veux cacher les boutons pour tenter de réduire la redéfinition sur le défilement, etc.

Ce code se trouve dans '-(void) swipeOff' qui est appelé dans la méthode de UITableViewControllers scrollViewWillBeginDragging comme suit :

- (void)scrollViewWillBeginDragging:(UIScrollView *) scrollView
{
   for (MediaCellView* cell in [self.tableView visibleCells]) {
        if (cell.hasSwipeOpen) {
           [cell swipeOff];
        }
    }
}

Le problème est le code d'achèvement, si je le supprime ou si je lui attribue la valeur nil, tout va bien, mais si je l'inclus, j'obtiens un EXC_BAD_ACCESS, même si je l'inclus en commentant tout ou partie des lignes de l'if(finished).

Suis-je en train de l'utiliser de la mauvaise façon ? Toute aide est la bienvenue.

Merci

20voto

ivanzoid Points 2627

J'ai eu le même problème avec les animations. Je l'ai résolu en supprimant -weak_library /usr/lib/libSystem.B.dylib à partir de Other Linker flags.

En outre, selon cette réponse si vous avez besoin de ce drapeau, vous pouvez le remplacer par -weak-lSystem .

0voto

TDesign Points 411

Vérifiez que vous n'appelez pas un UIView (collectionView, Mapview, etc.) à l'intérieur du bloc UIView, ce qui signifie qu'il s'agirait d'un appel en dehors du thread principal. Si c'est le cas, essayez ceci :

DispatchQueue.main.async {
self.mapBoxView.setZoomLevel(self.FLYOVERZOOMLEVEL, animated: true
)}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X