segmentControl faire defiler les pages d'un detailsView

paddevpaddev Membre
Bonjour a tous,

J'ai une tableView dans laquelle sont classés des artistes par ordre alphabétique, quand j'appuie sur une cellule, une page s'affiche pour montrer les details de l'artistes. (avec pushviewcontroller).
J'aimerais dnas la page details mettre 2 boutons (up et down) pour pouvoir faire defiler les pages mais je ne sais pas trop comment faire.
Voici le code de ma page detail, je ne sais pas comment recuperer l'index dans ma fonction segmentAction.

Merci pour votre aide.

<br />#import &quot;DetailsArtistes.h&quot;<br />#import &quot;UIImage+Resize.h&quot;<br />@implementation DetailsArtistes<br />@synthesize DetailsTitre,viewHaut,music,DetailsImage,viewMilieu,viewBas,bouton1,bouton2,bouton3,vue,table,segControl,items,currentRow;<br />- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil<br />{<br />&nbsp; &nbsp; self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];<br />&nbsp; &nbsp; if (self) {<br />&nbsp; &nbsp; &nbsp; &nbsp; // Custom initialization<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; return self;<br />}<br /><br />- (void)didReceiveMemoryWarning<br />{<br />&nbsp; &nbsp; // Releases the view if it doesn&#039;t have a superview.<br />&nbsp; &nbsp; [super didReceiveMemoryWarning];<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; // Release any cached data, images, etc that aren&#039;t in use.<br />}<br /><br />#pragma mark - View lifecycle<br /><br />- (void)viewDidLoad<br />{<br />&nbsp;  	// &quot;Segmented&quot; control to the right<br />	UISegmentedControl *segmentedControl = [[UISegmentedControl alloc] initWithItems:<br />											[NSArray arrayWithObjects:<br />											 [UIImage imageNamed:@&quot;up.png&quot;],<br />											 [UIImage imageNamed:@&quot;down.png&quot;],<br />											 nil]];<br />	[segmentedControl addTarget:self action:@selector(segmentAction:) forControlEvents:UIControlEventValueChanged];<br />	segmentedControl.frame = CGRectMake(0, 0, 90, 30.0);<br />	segmentedControl.segmentedControlStyle = UISegmentedControlStyleBar;<br />	segmentedControl.momentary = YES;<br />&nbsp; &nbsp; <br />	UIBarButtonItem *segmentBarItem = [[UIBarButtonItem alloc] initWithCustomView:segmentedControl];<br /><br />&nbsp; &nbsp; <br />	self.navigationItem.rightBarButtonItem = segmentBarItem;<br />	self.segControl = segmentedControl;<br /><br />&nbsp; &nbsp; <br />&nbsp; &nbsp; <br />&nbsp; &nbsp; self.vue=[[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 460)];<br />&nbsp; &nbsp; self.vue.backgroundColor =[UIColor blackColor];<br />&nbsp; &nbsp; [self.view addSubview:self.vue];<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; viewHaut = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 320, 100)];<br />&nbsp; &nbsp; viewHaut.backgroundColor = [UIColor colorWithRed:(30.0/255.0) green:(30.0/255.0) blue:(30.0/255.0) alpha:1.0];<br />&nbsp; &nbsp; [vue addSubview:viewHaut];<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; DetailsTitre = [[UILabel alloc]initWithFrame:CGRectMake(120, 20, 210, 20)];<br />&nbsp; &nbsp; DetailsTitre.text=music.musicTitle;<br />&nbsp; &nbsp; DetailsTitre.backgroundColor = [UIColor clearColor];<br />&nbsp; &nbsp; DetailsTitre.textColor = [UIColor whiteColor];<br />&nbsp; &nbsp; DetailsTitre.font=[UIFont boldSystemFontOfSize:16];<br />&nbsp; &nbsp; [viewHaut addSubview:DetailsTitre];<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; DetailsImage=[[UIImageView alloc] initWithFrame:CGRectMake(10, 10, 80, 80)];<br /><br />&nbsp;  <br />	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  <br />&nbsp;  DetailsImage.image=[[UIImage imageNamed:[music musicPhoto]] thumbnailImage:80&nbsp; &nbsp; transparentBorder:0<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  cornerRadius:5<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  interpolationQuality:90];<br />&nbsp; &nbsp; [DetailsImage.layer setBorderColor: [[UIColor whiteColor] CGColor]]; [DetailsImage.layer setBorderWidth: 2.0];<br />[viewHaut addSubview:DetailsImage];<br />&nbsp; &nbsp; <br />&nbsp;  <br />&nbsp; &nbsp; <br />&nbsp; &nbsp; viewBas = [[UITextView alloc]initWithFrame:CGRectMake(10, 150, 300, 210)];<br />&nbsp; &nbsp; viewBas.backgroundColor = [UIColor blackColor];<br />&nbsp; &nbsp; viewBas.textColor=[UIColor whiteColor];<br />&nbsp; &nbsp; viewBas.editable = NO;<br />&nbsp; &nbsp; viewBas.font =[UIFont fontWithName:@&quot;Arial&quot; size:16];<br />&nbsp; &nbsp; viewBas.autoresizesSubviews=YES;<br />&nbsp; &nbsp; viewBas.autoresizingMask=(UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth);<br />&nbsp; &nbsp; viewBas.text=music.musicDescription;<br />&nbsp; &nbsp; [vue addSubview:viewBas];<br />&nbsp; &nbsp; <br /> <br />&nbsp; &nbsp; [super viewDidLoad];<br />&nbsp; &nbsp; // Do any additional setup after loading the view from its nib.<br />}<br /><br />- (IBAction)segmentAction:(id)sender<br />{<br />	//[color=red][b]Que mettre ici?[/b][/color]<br />	}<br /><br />}<br /><br /><br />&nbsp; &nbsp; <br />&nbsp; &nbsp; <br /><br />- (void)viewDidUnload<br />{<br />&nbsp; &nbsp; [super viewDidUnload];<br />&nbsp; &nbsp; // Release any retained subviews of the main view.<br />&nbsp; &nbsp; // e.g. self.myOutlet = nil;<br />}<br /><br />- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation<br />{<br />&nbsp; &nbsp; // Return YES for supported orientations<br />&nbsp; &nbsp; return (interfaceOrientation == UIInterfaceOrientationPortrait);<br />}<br /><br />@end<br />

Réponses

  • paddevpaddev Membre
    10:28 modifié #2
    j'oubliais, voici comment je push ma vue:

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath<br />{<br />&nbsp; &nbsp; &nbsp;  NSUInteger section = [indexPath section];<br />&nbsp; &nbsp; DetailsArtistes *detailVC = [[DetailsArtistes alloc] initWithNibName:@&quot;DetailsArtistes&quot; bundle:nil];<br /><br />&nbsp; &nbsp; &nbsp; &nbsp; ws=(Music *)[tabMusic objectAtIndex:indexPath.row];<br />&nbsp; &nbsp; <br /><br />	<br />&nbsp; &nbsp; detailVC.music =ws;<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; detailVC.view.backgroundColor = [UIColor blackColor];<br />&nbsp; &nbsp; <br />	<br />&nbsp;  	[self.navigationController pushViewController:detailVC animated:YES];<br />&nbsp; &nbsp; [tableView deselectRowAtIndexPath:indexPath animated:YES];<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; <br />&nbsp; &nbsp; <br />}
    


  • iSofTomiSofTom Membre
    10:28 modifié #3
    Bonjour Paddev,
    ce que tu peux faire pour ton problème c'est de passer à  ton controller "DetailsArtistes" l'index de l'objet "Music" que tu lui passes, ainsi qu'un lien vers ton controller courant (celui qui a la tableView).
    Ainsi quand l'utilisateur appui sur le bouton up il te suffit de demander à  ton controller la Music à  l'index i-1, et ensuite tu remet à  jour ton controller DetailsArtistes.
  • paddevpaddev Membre
    10:28 modifié #4
    merci pour ta réponse, pourrais tu me montrer comment passer l'index de music car j'ai compris la démarche mais je suis bloqué pour réaliser la manoeuvre..

  • paddevpaddev Membre
    10:28 modifié #5
    personne pour m'aider?
    Je voudrais faire le changement de page avec:  [UIView setAnimationTransition:UIViewAnimationTransitionCurlUp ...
  • paddevpaddev Membre
    10:28 modifié #6
    up! je relance le sujet.
    toujours pas résolu le probleme, un peu d'aide serait la bienvenue..
  • Alf1996Alf1996 Membre
    10:28 modifié #7
    Je ne suis pas sûre d'avoir bien compris ton problème, mais je crois que tu veux passer un variable à  ta vue détail, dans ce cas, utilise un delegate. Regarde l'excellent tutoriel fait par Ali :
    http://ressources.mediabox.fr/tutoriaux/apple/protocol

    Je pense que ça devrait t'aider  ;)
  • paddevpaddev Membre
    10:28 modifié #8
    merci pour le lien je vais regarder mais a 1ere vue je sais pas si cela va m'aider.
    En fait mon probleme est simple , j'ai une tableview et une vue de details.
    je voudrais dans la vue de details pouvoir faire defiler les pages grace a un segmentControl  mais je n'arrive pas a recuperer l'index courant de chaque page.

    Bref je galere...
  • Alf1996Alf1996 Membre
    10:28 modifié #9
    Bah justement tu passe un argument l'index de l'item sélectionné et tu t'en sert pour passer à  l'item suivant ou précédent...
    Mais je n'ai peut-être pas bien cerné ton problème  :o
  • paddevpaddev Membre
    10:28 modifié #10
    si je pense que tu as bien cerné, je veux faire comme dans l'application Mail de l'iphone , quand tu affiches le details de ton mail, tu as en haut a droite 2 fleches (haut et bas) pour passer au mail suivant.

    je vais essayer mais je n'arrive pas a trouver de tuto ou d'exemple sur le net .

    si quelqu'un a un lien ou a deja fait ce genre de manip..
  • paddevpaddev Membre
    10:28 modifié #11
    si tu veux il y a mon code au dessus si tu veux jeter un coup d'oeil.. :)
  • iSofTomiSofTom Membre
    10:28 modifié #12
    Si si c'est bien avec le principe de delegate que tu vas t'en sortir.

    Personnellement je ferais un truc comme ça:

    Nommons A le viewController qui contient ta tableView et B le viewController qui affiche les détails.

    <br />@protocol DetailsDelegate &lt;NSObject&gt;<br />- (BOOL)canDisplayPrevious;<br />- (BOOL)canDisplayNext;<br />- (void)displayPrevious;<br />- (void)displayNext;<br />- (Music*)currentMusic;<br />@end<br />
    


    Il faut que A respecte ce protocol, c'est à  dire qu'il implémente toutes ces méthodes.
    De plus c'est A qui va gérer l'index courant, qui sera incrémenté ou décrémenté par l'appel des méthodes displayNext et displayPrevious.

    et quand, dans l'écran A, l'utilisateur appui sur une cellule, tu garde l'index en mémoire et tu affiches un viewController B:
    <br />self.currentIndex = indexPath.row;<br />B* b = [[B alloc] init];<br />[b setDelegate:self];<br />[self.navigationController pushViewController:b animated:YES];<br />
    


    et dans le viewWillAppear de B tu vas tout simplement récupérer la music depuis ton delegate et te mettre à  jour et mettre Enabled ou non les boutons suivant et précédent suivant les valeurs retournées par les méthodes canDisplayNext et canDisplayPrevious du delegate.

    Enfin dans B, si l'utilisateur appui sur le bouton suivant, tu fais:
    <br />[delegate displayNext];<br />self.music = [delegate currentMusic];<br />[self.previousArrow setEnabled:[delegate canDisplayPrevious]];<br />[self.nextArrow setEnabled:[delegate canDisplayNext]];<br />
    


    Je ne sais pas si c'est très clair, hésite pas si t'as des questions.
    (Ce code est fait a l'arrache, mais c'est pour illustrer un peu comment on peut faire).
  • paddevpaddev Membre
    10:28 modifié #13
    merci pour l'exemple, je vais regarder cela de plus pres, j'aurai surement des questions.. :)
  • en fait j'arrive bien à  récupere l'indes et les données, le probleme maintenant c'est quand j'appuis sur les bouton pour passer à  l'artiste suivant, l'artiste se superpose à  l'autre, en clair l'artiste précédent reste en place.

    Comment puis je recharger une vue dans ce cas car je pense que le probleme vient de la.

    merci
Connectez-vous ou Inscrivez-vous pour répondre.