ヘッダーに 2 つのボタンがある UITableViewController があります。
ボタン 1 - ユーザー名 API からデータを取得し、テーブルビューを更新して、セルごとに 1 つの文字列ユーザー名を表示します
ボタン 2 - ビデオ API からデータを取得し、テーブルビューを更新し、セルごとに AVPlayer のインスタンスを 1 つ表示します。
ビデオ ボタンを押すと、各セルがビデオを適切に表示します。
ユーザー名ボタンを押すと、その下にユーザー名のテーブルビューが表示されますが、その上には、破棄を拒否するすべてのビデオが表示されます。それらを破壊する方法を見つける必要があります。
テーブルビューの行ごとに1つずつ、AVPlayerの複数のインスタンスを即座に破棄する方法はありますか?
UITableViewController: PFQueryTableViewController
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object {
static NSString *CellIdentifier = @"Cell";
//the userOrVideoString is a string property assigned a value whenever the user presses the user or video button
if([self.userOrVideoString isEqualToString:@"video"]) {
VideoCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[VideoCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
NSString *dateString = [NSDateFormatter localizedStringFromDate:object.updatedAt
dateStyle:NSDateFormatterShortStyle
timeStyle:NSDateFormatterFullStyle];
PFFile *file = [object objectForKey:@"videoFile"];
Video *vid = [Video videoWithStringURL:file.url];
//problem - easy to init these videos, can't delete them though?
[cell setVideo:vid];
[cell play];
cell.textLabel.text = dateString;
return cell;
}
else {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
NSString *username = [object objectForKey:@"username"];
cell.textLabel.text = username ;
return cell;
}
}
-(void) didPressUserButton {
self.userOrVideoString = @"User";
[self.tableView reloadData];
[self loadObjects];
}
-(void) didPressVideoButton {
self.userOrVideoString = @"video";
[self.tableView reloadData];
[self loadObjects];
}
カスタム ビデオセル : UITableViewCell
- (void)setVideo:(Video *)video
{
NSLog(@"%s : %@", __PRETTY_FUNCTION__, video);
//videoPlayer is an AVPlayer as a property
[self.videoPlayer replaceCurrentItemWithPlayerItem:[AVPlayerItem playerItemWithAsset:video.video]];
[self.videoPlayer setActionAtItemEnd:AVPlayerActionAtItemEndNone];
self.videoLayer = [AVPlayerLayer playerLayerWithPlayer:self.videoPlayer];
[self.videoLayer setPlayer:self.videoPlayer];
[self.videoLayer setBackgroundColor:[[UIColor blackColor] CGColor]];
[self.videoView.layer addSublayer:self.videoLayer];
self.videoPlayer.actionAtItemEnd = AVPlayerActionAtItemEndNone;
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(playerItemDidReachEnd:)
name:AVPlayerItemDidPlayToEndTimeNotification
object:[self.videoPlayer currentItem]];
// Here we add an KVO to the player to know when the video is ready to play
// This is important if you want the user to see something while the video is being loaded
[self.videoPlayer addObserver:self forKeyPath:@"status" options:0 context:nil];
// Here we need to add the indicator to the video views layer
// Then start animating
// But if the video is already ready to play, then we dont add it
// This case comes up when the video has been cached like we have done so
// and the cell is being reused
if ([self.videoPlayer status] != AVPlayerStatusReadyToPlay) {
[self.videoView.layer addSublayer:[self.indicator layer]];
[self.indicator startAnimating];
}
}
- (void)play
{
[self.videoPlayer play];
}