MPMediaQuery to return local items only

 ̄綄美尐妖づ 提交于 2019-12-04 10:53:03

问题


I want to display a UITableView with only the songs that are currently on the device.

If I query all items I (obviously) get all items, including the once that I purchased but not have downloaded. Here is the (part) of the code

@property (strong, nonatomic) NSMutableArray *songsList;

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.tableView.delegate = self;
    self.tableView.dataSource = self;
    MPMediaQuery *everything = [[MPMediaQuery alloc] init];
    NSArray *itemsFromGenericQuery = [everything items];
    self.songsList = [NSMutableArray arrayWithArray:itemsFromGenericQuery];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return self.songsList.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellIdentifier = @"TableCellID";
    TableCellTitle *tablecell = (TableCellTitle *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
MPMediaItem *song = [self.songsList objectAtIndex:indexPath.row];

    NSString *songTitle = [song valueForProperty: MPMediaItemPropertyTitle];
    tablecell.cellSongname.text = songTitle;

    return tablecell;
}

I have read a couple of things about involving

[song valueForProperty:MPMediaItemPropertyIsCloudItem]

but can't get it to work as I explained above. Any suggestions?


回答1:


I solved it myself by adding the following line in the viewDidLoad method between MPMediaQuery... and NSArray...

[everything addFilterPredicate:[MPMediaPropertyPredicate predicateWithValue:[NSNumber numberWithBool:NO] forProperty:MPMediaItemPropertyIsCloudItem]];



回答2:


Initialize MPMediaQuery like this in ViewDidLoad method.

MPMediaQuery * everything = [MPMediaQuery songsQuery];
self.songsList = [everything items];
[self.tableView reloadData];

and Cell for Index method

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

    static NSString *cellIdentifier = @"TableCellID";
    TableCellTitle *tablecell = (TableCellTitle *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    MPMediaItem *anItem = (MPMediaItem *)[self.songsList objectAtIndex: indexPath.row];

    if([anItem valueForProperty:MPMediaItemPropertyTitle]) {
       tablecell.cellSongname.text = [anItem valueForProperty:MPMediaItemPropertyTitle];

    }

    return tablecell;

}


来源:https://stackoverflow.com/questions/19450392/mpmediaquery-to-return-local-items-only

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!