Uislider avec avancement auto dans uitableview qui revient à  0 quand on scroll

NoikNoik Membre
avril 2012 modifié dans API UIKit #1
Bonjour,



je rencontre un petit problème ennuyeux et j'aurais espéré avoir de l'aide par ici.



J'ai une uitableview, dans chaque uitableviewcell je mets un uislider individuel.

Chaque uislider, sert de barre de progression pour la lecture de fichiers audio.


<br />
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {<br />
<br />
UIButton *button = nil;<br />
UISlider *customSlider = nil;<br />
<br />
static NSString *CellIdentifier = @&quot;cell&quot;;<br />
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];<br />
<br />
if (cell == nil) {<br />
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];<br />
<br />
UIImage *image = [UIImage imageNamed:@&quot;bouton_play.png&quot;];<br />
button = [UIButton buttonWithType:UIButtonTypeCustom];<br />
CGRect frame = CGRectMake(340.0, 10.0, image.size.width, image.size.height);<br />
button.frame = frame;<br />
[button setBackgroundImage:image forState:UIControlStateNormal];<br />
[button addTarget:self action:@selector(playAudio:) forControlEvents:UIControlEventTouchUpInside];<br />
button.tag = 4;<br />
[cell.contentView addSubview:button];<br />
<br />
customSlider = [[UISlider alloc] initWithFrame:CGRectMake(10, 45, 456, 20)];<br />
customSlider.minimumValue = 0.0;<br />
customSlider.maximumValue = 100.0;<br />
customSlider.continuous = YES;<br />
customSlider.tag = 3;<br />
customSlider.value = 0.0;<br />
[cell.contentView addSubview:customSlider];<br />
}<br />
<br />
else {<br />
customSlider = (UISlider *)[cell.contentView viewWithTag:3];<br />
button = (UIButton *)[cell.contentView viewWithTag:4];<br />
}<br />
return cell;<br />
}<br />
<br />
- (void) playAudio:(UIButton *)sender {<br />
UIButton *button = (UIButton *)[sender superview];<br />
UITableViewCell *currentCellTouched = (UITableViewCell *)[button superview];<br />
UITableView *currentTable = (UITableView *)[currentCellTouched superview];<br />
NSIndexPath *indexPath = [currentTable indexPathForCell:currentCellTouched];<br />
//currentCellPlaying est de type UITableViewCell et accessible depuis l&#39;ensemble de la classe<br />
currentCellPlaying = currentCellTouched;NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:NSLocalizedString([listFilesAudio objectAtIndex:indexPath.row], @&quot;&quot;) ofType:@&quot;mp3&quot;]];<br />
player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];<br />
player.delegate = self;<br />
[player prepareToPlay];[(UISlider *)[currentCellTouched.contentView viewWithTag:3] setMaximumValue:[player duration]];<br />
[(UISlider *)[currentCellTouched.contentView viewWithTag:3] setValue:0.0];<br />
NSTimer *sliderTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateTime:) userInfo:nil repeats:YES];<br />
[player play];}<br />
<br />
- (void)updateTime:(NSTimer *)timer {<br />
[(UISlider *)[currentCellPlaying.contentView viewWithTag:3] setValue:player.currentTime];<br />
}<br />




Quand je lance une lecture individuelle, tout se passe bien la barre d'avancement s'actualise correctement.



Mon problème est quand je fait défiler la tableview, et que la cellule où la lecture se fait disparait, une fois qu'on revient dessus le slider est revenu à  0, et n'est plus actualisé (alors qu'un NSLog dans updateTime retourne bien quelque chose tout le temps qu'il faut).



Bref, si vous avez la solution à  ce problème, j'apprécierai énormément !

Réponses

  • AliGatorAliGator Membre, Modérateur
    Bah parce que quand tu scroll ça recycle les cells.

    Et que du coup currentCellPlaying n'est plus la même (celle vers laquelle tu pointes a depuis été recyclée pour être utilisée sans doute pour une autre ligne de ta table, voire est en attente de réutilisation, mais en tout cas ne correspond plus au même son que ce qu'elle représentait au début puisqu'elle a été recyclée pour présenter une autre ligne / un autre son.
Connectez-vous ou Inscrivez-vous pour répondre.