2016-04-20 2 views
0

Je suis un débutant et c'est peut-être une question triviale. J'ai cette méthode:appel NSString avec plusieurs paramètres

-(NSString *)getInfoFormediaItem:(MPMediaItemCollection *)list {  
NSString *trackCount; 

if ([list count] > 0) { 
    trackCount = [NSString stringWithFormat:NSLocalizedString(@"%lu Songs", @""), (unsigned long)[list count]]; 
} else if([list count] == 1) { 
    trackCount = [NSString stringWithFormat:NSLocalizedString(@"1 Song", @"")]; 
} else { 
    trackCount = [NSString stringWithFormat:NSLocalizedString(@"0 Song", @"") ]; 
} 

return [NSString stringWithFormat:@"%@", trackCount]; 
} 

Je voudrais appeler ici avec un MPMediaItemCollection:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"]; 

if(cell == nil) 
{ 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"cell"]; 
} 

MPMediaQuery *playlistsQuery = [MPMediaQuery playlistsQuery]; 
NSArray *playl = [playlistsQuery collections]; 
MPMediaItem *rowItem = [playl objectAtIndex:indexPath.row]; 
MPMediaItemCollection * collection = [[MPMediaItemCollection alloc] initWithItems:[NSArray arrayWithObject:rowItem]]; 

cell.detailTextLabel.text = [self getInfoFormediaItem:collection]; 
} 

Je voudrais obtenir le nombre de pistes dans chaque liste de lecture. Cela ne fonctionne pas. Comment puis-je résoudre? Merci d'avance!

+0

La fonction de sélecteur que vous utilisez n'est pas nécessaire et un peu étrange. La raison pour laquelle c'est toujours 0 est parce que vous ne passez jamais un argument dans votre méthode. Donc [nombre nul] est toujours 0. Vous devriez appeler cela directement. [self getInfoForMediaItem: someMPMediaItemCollection]; – Dare

Répondre

5
  1. Pourquoi utilisez-vous performSelector:withObject:? Il suffit d'appeler la méthode directement:

    cell.detailTextLabel.text = [self getInfoFormediaItem:collection]; 
    
  2. Pourquoi Vous êtes de passage nil au paramètre withObject:? C'est pourquoi votre code va au else. list est nil donc [list count] sera toujours 0. Vous devez passer une instance réelle d'un MPMediaItemCollection. Pourquoi utilisez-vous inutilement stringWithFormat: pour les vérifications à 1 et 0 points? Il suffit de faire:

    -(NSString *)getInfoFormediaItem:(MPMediaItemCollection *)list {  
        NSString *trackCount; 
    
        if ([list count] > 1) { 
         trackCount = [NSString stringWithFormat:NSLocalizedString(@"%lu Songs", @""), (unsigned long)[list count]]; 
        } else if([list count] == 1) { 
         trackCount = NSLocalizedString(@"1 Song", @""); 
        } else { 
         trackCount = NSLocalizedString(@"0 Song", @""); 
        } 
    
        return trackCount; 
    } 
    
  3. Sur la base de votre question mise à jour, votre code cellForRowAtIndexPath ne correspond pas à l'obtention de la collecte des médias. La méthode collections renvoie un tableau d'objets MPMediaCollection, et non MPMediaItem objets. Vous avez besoin:

    MPMediaQuery *playlistsQuery = [MPMediaQuery playlistsQuery]; 
    NSArray *playl = [playlistsQuery collections]; 
    MPMediaItemCollection *collection = playl[indexPath.row]; 
    

    Maintenant, vous pouvez utiliser collection lorsque vous appelez getInfoFormediaItem:.

+0

Bonjour! Merci pour votre réponse. Oui juste 'return trackCount'; . A propos de: someList J'ai _Utiliser un identificateur non déclaré someList_ et il nécessite un paramètre de type MPMediaItemCollection.Quel paramètre? Merci pour la patience – Joannes

+0

Mon utilisation de someList a été conçu comme un espace réservé. Vous devez remplacer cela par une instance réelle d'un MPMediaItemCollection. – rmaddy

+0

Pouvez-vous me donner un exemple? Dans cellForRowAtIndexPath j'ai besoin d'une instance d'un MPMediaItemCollection? MPMediaItemCollection * count; – Joannes

0

Il vous suffit de ne pas besoin d'appeler cette déclaration: méthode

cell.detailTextLabel.text = [self performSelector:@selector(getInfoFormediaItem:) withObject:nil]; 

dans votre "getInfoFormediaItem". Vous faites cela dans votre méthode « cellforrowataIndexPath » lorsque vous définissez la cellule, il suffit d'appeler comme ceci:

cell.detailTextLabel.text = [self getInfoFormediaItem:This_Is_A_List_You_Wanna_Pass_To_The_Method]; 

et vous devriez être bon d'aller.

+0

Avec This_Is_A_List_You_Wanna_Pass_To_The_Method, que dois-je faire? Il nécessite un paramètre de type MPMediaItemCollection – Joannes

+0

J'essaie 'MPMediaQuery * playlistsQuery = [MPMediaQuery playlistsQuery]; NSArray * playl = [playlistsQuery collections]; MPMediaItem * rowItem = [playl objectAtIndex: indexPath.row]; MPMediaItemCollection * collection = [[MPMediaItemCollection alloc] initWithItems: [NSArray arrayWithObject: rowItem]]; 'mais retourne toujours 1. – Joannes

0

En plus des problèmes signalés par d'autres affiches, votre instruction if ne fonctionnera pas comme vous le souhaitez:

if ([list count] > 0) { 
    trackCount = [NSString stringWithFormat:NSLocalizedString(@"%lu Songs", 
    @""), (unsigned long)[list count]]; 
} else if([list count] == 1) { 
    trackCount = [NSString stringWithFormat:NSLocalizedString(@"1 Song", @"")]; 
} else { 
    trackCount = [NSString stringWithFormat:NSLocalizedString(@"0 Song", @"") ]; 
} 

La clause « si ...> 0 » correspondront en premier, avant de vérifier pour une valeur de 1, puisque 1 est> 0. Ainsi, le "if ... == 1" n'évaluera jamais comme vrai. Vous devez réorganiser cette instruction if:

if ([list count] == 1) { 
    trackCount = NSLocalizedString(@"1 Song", @""); 
else if ([list count] > 0) { 
    trackCount = [NSString stringWithFormat:NSLocalizedString(@"%lu Songs", 
    @""), (unsigned long)[list count]]; 
} 
else 
{ 
    trackCount = NSLocalizedString(@"0 Songs", @""); 
}