2016-04-20 15 views
0

Ich bin ein Anfänger und vielleicht ist es eine triviale Frage. Ich habe diese Methode:Anruf NSString mit mehreren Parametern

-(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]; 
} 

ich es nennen hier mit einem MPMediaItemCollection möchte:

- (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]; 
} 

Ich möchte die Anzahl der Spuren in jeder Wiedergabeliste erhalten. Es funktioniert nicht. Wie repariere ich? Danke im Voraus!

+0

Die Ausführung Selektor, was Sie dort haben, ist nicht notwendig und ein wenig seltsam. Der Grund, warum es immer 0 ist, ist, dass Sie niemals ein Argument in Ihre Methode eingeben. Also [Nullzählung] ist immer 0. Sie sollten das direkt anrufen. [self getInfoForMediaItem: someMPMediaItemCollection]; – Dare

Antwort

5
  1. Warum Sie mit performSelector:withObject: werden? Nur die Methode direkt aufrufen:

    cell.detailTextLabel.text = [self getInfoFormediaItem:collection]; 
    
  2. Warum sind vorbei Sie nil zum withObject: Parameter? Deshalb geht Ihr Code an die else. list ist nil, also [list count] wird immer 0 sein. Sie müssen eine tatsächliche Instanz eines MPMediaItemCollection übergeben.

  3. Warum verwenden Sie unnötigerweise stringWithFormat: für die 1 und 0 Zählungen? Just do:

    -(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; 
    } 
    
  4. Basierend auf Ihre Frage aktualisiert, Ihre cellForRowAtIndexPath Code ist nicht korrekt für die die Mediensammlung zu bekommen. Die collections Methode gibt ein Array von MPMediaCollection Objekten zurück, nicht MPMediaItem Objekte. Sie benötigen:

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

    Jetzt können Sie collection verwenden, wenn Sie getInfoFormediaItem: nennen.

+0

Hallo! Danke für deine Antwort. Ja, nur 'trackCount zurückgeben;' . Info: someList Ich habe _Use von nicht deklarierten Bezeichner someList_ und es erfordert einen Parameter vom Typ MPMediaItemCollection.Welcher Parameter? Danke für die Geduld – Joannes

+0

Meine Verwendung von someList war als Platzhalter gedacht. Sie müssen das durch eine tatsächliche Instanz einer MPMediaItemCollection ersetzen. – rmaddy

+0

Können Sie mir ein Beispiel geben? In CellForRowAtIndexPath benötige ich eine Instanz einer MPMediaItemCollection? MPMediaItemCollection * zählen; – Joannes

0

Sie einfach nicht brauchen diese Aussage zu nennen:

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

in Ihrem "getInfoFormediaItem" -Methode. Sie tun das in Ihrem „cellforrowataIndexPath“ -Methode, wenn Sie die Zelle zu definieren, rufen Sie einfach wie folgt aus:

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

und Sie sollten gut zu gehen.

+0

Mit This_Is_A_List_You_Wanna_Pass_To_The_Method Was muss ich bestehen? Es erfordert einen Parameter vom Typ MPMediaItemCollection – Joannes

+0

Ich versuche 'MPMediaQuery * playlistsQuery = [MPMediaQuery playlistsQuery]; NSArray * Wiedergabeliste = [PlaylistsQuery-Sammlungen]; MPMediaItem * rowItem = [WiedergabelistenobjektAtIndex: indexPath.row]; MPMediaItemCollection * sammlung = [[MPMediaItemCollection alloc] initWithItems: [NSArray arrayWithObject: rowItem]]; 'aber immer 1 zurückgeben. – Joannes

0

Zusätzlich zu den Problemen hingewiesen durch andere Plakate aus, Ihre if-Anweisung wird nicht funktionieren, wie Sie es wollen:

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", @"") ]; 
} 

Die „if ...> 0“ Klausel zuerst übereinstimmen, vor der Prüfung für einen Wert von 1, da 1> 0 ist. Daher wird das "if ... == 1" niemals als wahr ausgewertet. Sie müssen das neu anordnen, wenn Anweisung: