1

iPod ライブラリ内のすべてのビデオ (映画、テレビ番組など) を一覧表示し、ユーザーが選択したビデオを再生できるようにするシンプルなアプリをまとめようとしています。アプリは、UITableView を含む NavigationController を持つストーリーボードを使用しています。

クエリが実際に MPMediaItems を取得しているように見えますが、セルは各映画のタイトルで更新されていません。これを見て、私が間違っていることを教えてもらえますか?

.h は次のとおりです。

#import <UIKit/UIKit.h>
#import <MediaPlayer/MediaPlayer.h>

@interface MovieListViewController : UITableViewController
{
    MPMediaQuery * _movieQuery;
    NSArray * _movieArray;
}

@property (nonatomic,strong) MPMediaQuery *movieQuery;
@property (nonatomic,strong) NSArray *movieArray;

@end

そして、ここに.mがあります:

#import "MovieListViewController.h"

@interface MovieListViewController ()

@end

@implementation MovieListViewController

@synthesize movieQuery = _movieQuery,
            movieArray = _movieArray;

- (id)initWithStyle:(UITableViewStyle)style
{
    self = [super initWithStyle:style];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Uncomment the following line to preserve selection between presentations.
    // self.clearsSelectionOnViewWillAppear = NO;

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    // self.navigationItem.rightBarButtonItem = self.editButtonItem;

    MPMediaPropertyPredicate *predicate = [MPMediaPropertyPredicate predicateWithValue:[NSNumber numberWithInteger:MPMediaTypeAnyVideo] forProperty:MPMediaItemPropertyMediaType];

    MPMediaQuery *movieQuery = [[MPMediaQuery alloc] init];
    [movieQuery addFilterPredicate:predicate];

    NSLog(@"movieQuery got back %u results",[[movieQuery items]count]);

    self.movieArray = [movieQuery items];

}

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Dispose of any resources that can be recreated.
    self.movieQuery = nil;
    self.movieArray = nil;
}


- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

#pragma mark - Table view data source

/*- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    return 0;
}*/

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // Return the number of rows in the section.
    NSLog(@"UITableView has %u rows",[self.movieArray count]);
    return [self.movieArray count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    // Configure the cell...

    MPMediaItem *item = [[self.movieQuery items]objectAtIndex:[indexPath row]];
    cell.textLabel.text = [item valueForProperty:MPMediaItemPropertyTitle];
    return cell;
}
4

1 に答える 1

1

問題は次の行にあります。

MPMediaItem *item = [[self.movieQuery items]objectAtIndex:[indexPath row]];

それを次のように変更します。

MPMediaItem *item = [movieArray objectAtIndex:[indexPath row]];

オブジェクトに何も追加せずmovieQuery、ローカルMPMediaQueryオブジェクトを作成しviewDidLoadて使用しました。

別の解決策:

viewDidLoad次のように変更します。

- (void)viewDidLoad
{
    [super viewDidLoad];

    MPMediaPropertyPredicate *predicate = [MPMediaPropertyPredicate predicateWithValue:[NSNumber numberWithInteger:MPMediaTypeAnyVideo] forProperty:MPMediaItemPropertyMediaType];

    self.movieQuery = [[MPMediaQuery alloc] init];
    [movieQuery addFilterPredicate:predicate];

    NSLog(@"movieQuery got back %u results",[[self.movieQuery items]count]);

    self.movieArray = [self.movieQuery items];

}
于 2013-08-02T04:20:44.240 に答える