2012-01-05 7 views
0

私はiOSの開発を開始しました。ポイントに右を取得するには...私は再生したいいくつかのオーディオファイルで設定されたUITableViewControllerを作成しました。私は正常に選択した行の文字列を渡し、UIViewControllerである 'Now Play View'にビューを変更します。そこから私はavaudioplayerを使用してオーディオを再生します。新しいオーディオインスタンスを作成し、以前選択したオーディオの上で新しく選択したオーディオを再生します。新しく選択したオーディオをロードできる「再生中」ビューを作成するにはどうすればよいですか?ここで既にデータが渡されているUIViewに戻る

#import <UIKit/UIKit.h> 
#import <AVFoundation/AVFoundation.h> 
#import <AudioToolbox/AudioToolbox.h> 

@interface NowPlayingViewController : UIViewController{ 

    AVAudioPlayer *audioPlayer; 

    //playPause button images 
    UIImage *playImg; 
    UIImage *pauseImg; 

    IBOutlet UIButton *playPauseButton; 

    //Volume slider 
    NSTimer *volumeTimer; 
    IBOutlet UISlider *volumeSlider; 

} 

//playPause button action 
- (IBAction)playPause:(id)sender; 
@end 

??古いオーディオをクリアすると、実装ファイルである。

#import "NowPlayingViewController.h" 

    @implementation NowPlayingViewController 


    #pragma mark - My actions 
    //Audio Player Controllers 

    //Play the selected audio. 
    - (IBAction)playPause:(id)sender 
    { 
     if (![audioPlayer isPlaying]) { 
      [playPauseButton setImage:pauseImg forState:UIControlStateNormal]; 
      [audioPlayer play]; 
     } else { 
      [playPauseButton setImage:playImg forState:UIControlStateNormal]; 
      [audioPlayer pause]; 
     } 
    } 

    -(void)updateVolumeSlider 
    { 
     [audioPlayer setVolume:volumeSlider.value]; 
    } 

    #pragma mark - Initialization 
    - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
    { 
     self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
     if (self) { 
      // Custom initialization 
     } 
     return self; 
    } 

    - (void)didReceiveMemoryWarning 
    { 
     // Releases the view if it doesn't have a superview. 
     [super didReceiveMemoryWarning]; 

     // Release any cached data, images, etc that aren't in use. 
    } 

    #pragma mark - View lifecycle 
    - (void)viewDidLoad 
    { 
     [super viewDidLoad]; 

     //Instantiate needed variables 
     playImg = [UIImage imageNamed:@"Play.png"]; 
     pauseImg = [UIImage imageNamed:@"Pause.png"]; 

     //Prepare the audio player 
     NSString *path = [[NSBundle mainBundle] pathForResource:self.title ofType:@"m4a"]; 
     audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL]; 
     [audioPlayer prepareToPlay]; 

     //Setup the volume slider 
     volumeTimer = [NSTimer scheduledTimerWithTimeInterval:0 target:self selector:@selector(updateVolumeSlider) userInfo:nil repeats:YES]; 
    } 

MAINVIEWヘッダー

#import <UIKit/UIKit.h> 

@interface MainTableViewController : UITableViewController{ 

    NSMutableArray *performanceArray; 
    NSMutableArray *recoveryArray; 

} 

@end 

MAINVIEW実装ファイル

#import "MainTableViewController.h" 
#import "NowPlayingViewController.h" 


@implementation MainTableViewController 


#pragma mark - Table view 
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    // Return the number of sections. 
    return 2; 
} 

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{ 
    if(section == 0) 
     return @"Performance"; 
    else 
     return @"Recovery"; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    if(section == 0) 
     return [performanceArray count]; 
    else 
     return [recoveryArray count]; 
} 

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
    } 

    // Configure the cell... 
    if(indexPath.section == 0) 
     cell.textLabel.text = [performanceArray objectAtIndex:indexPath.row]; 
    else 
     cell.textLabel.text = [recoveryArray objectAtIndex:indexPath.row]; 
    return cell; 
} 

#pragma mark - Prepare data to pass 
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    // Make sure your segue name in storyboard is the same as this line 
    if ([[segue identifier] isEqualToString:@"Audio Selection Segue"]) 
    { 
     // Get reference to the destination view controller 
     NowPlayingViewController *np = [segue destinationViewController]; 

     //Pass the selected audio title to the Now Playing View 
     UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:self.tableView.indexPathForSelectedRow]; 
     np.title = cell.textLabel.text; 
    } 
} 

#pragma mark - didSelectRowAtIndexPath 
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    [self performSegueWithIdentifier:@"Audio Selection Segue" sender:self]; 
} 

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

- (void)didReceiveMemoryWarning 
{ 
    // Releases the view if it doesn't have a superview. 
    [super didReceiveMemoryWarning]; 

    // Release any cached data, images, etc that aren't in use. 
} 

#pragma mark - View lifecycle 
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    //Instantiate performanceArray 
    performanceArray = [[NSMutableArray alloc]initWithObjects:@"Centering", nil]; 

    //Instantiate recoveryArray 
    recoveryArray = [[NSMutableArray alloc]initWithObjects:@"Power Nap", nil]; 
} 
+0

NowPlayingビューのインスタンスを1つしか必要としませんあなたは新しいものをインスタンス化しています)、それはまだ古いオーディオを再生しています(これはあなたのNowPlayingビューがクラス変数で動作していることを意味します)。2番目の問題を解決するには、コードを見る必要があります。 –

+0

はい、私は新しいオーディオプレーヤーをインスタンス化しています。私は 'Now Playingクラス'を作成し、それをテーブルビューから渡すのですか?ヘッダファイルと実装ファイルを元の投稿に追加しました...ありがとうございました! – arynhard

+0

コントローラのコードは正常です。親コントローラー?ナビゲーションコントローラーからポップアップしても音楽が再生されますか? –

答えて

0

最初の部分は簡単です。新しいNowPlayingViewControllerをインスタンス化する代わりに、ナビゲーションスタックにプッシュするたびに、既存のものを再利用するだけです。次に、オーディオURLをNowPlayingViewControllerのプロパティに渡す必要があります。

@interface MyTableViewController { 
    NowPlayingViewController *nowPlayingViewController; 
} 

@implementation MyTableViewController{ 
    ... 
    nowPlayingViewController = [[nowPlayingViewController alloc]init]; 
    ... 
    [nowPlayingViewController setAudio:@"urlToAudio"] 
    this.navigationController.pushViewController(nowPlayingViewController); 
    ... 
} 

編集:上記の内容は、viewControllerをインスタンス化している場合にのみ該当します。ストーリーボードを使用していたことがわかります。これは、ビューコントロールの新しいインスタンスを自動的にインスタンス化します。したがって、問題はあなたが音楽を止めないことです(下記参照)。


2番目の部分(音楽は止まらない)については、どこの音楽も止めていないようです。ビューがもはや使用されていないときに呼び出される "viewDidUnload"、または "viewWillDisappear"デリゲートコールでそうする。新要件に基づいて


新編集:

  • あなたの音楽を制御するために、今すぐプレイビューを望みます。
  • Now Playingビューがアンロードされても音楽を停止しないようにします。

この場合、AudioPlayerとNow Playingビューを分離する必要があります。

NowPlayingビューが作成されるたびに、AudioPlayerを外部から渡す必要があります。最適には、音楽プレーヤーのアプリケーション状態を維持するクラスが必要です。その後

@interface MusicPlayer : NSObject{   
} 

// example 
-(bool) isPlaying; 
-(bool) isPaused; 

-(void) play; 
-(void) pause; 
-(void) stop; 
-(void) changeTrack; 

-(NSString *)currentTrack; 
//etc. 
@end 

、あなただけの、再生するトラックあなたのNowPlayingビューを伝えるのではなく、あなたのセグエを行うときに、代わりにそれをMusicPlayerインスタンスを渡します。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    // Make sure your segue name in storyboard is the same as this line 
    if ([[segue identifier] isEqualToString:@"Audio Selection Segue"]) 
    { 
     // Get reference to the destination view controller 
     NowPlayingViewController *np = [segue destinationViewController]; 

     //Pass the selected audio title to the Now Playing View 
     UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:self.tableView.indexPathForSelectedRow]; 

     [self.player stop]; 
     [self.player changeTrack:@"urlToTrack"]; 
     [self.player play]; 

     np.player = self.player; 
    } 
} 

ここで、再生するものなどを制御するボタンの代わりに、ボタンで音楽プレーヤーにメッセージを送信するだけです。一部のNSNotificationでは、ミュージックプレイヤーにあなたのビューにイベントを送信させて、アルバム名、トラック名、アルバムアートなどを更新することもできます。

+0

私は参照してください。驚くばかり!だから私が念頭に置いていたデザインは、music.appと非常に似ています。私は、テーブルビューからオーディオを選択し、今再生しているビューでオーディオを制御できるようにしたいと思います。私が決定したら、Now Playingからオーディオ選択テーブルビューに戻って再び戻ることができます。現在、新しいオーディオを選択すると、再生中のビューに戻ることができます。私はこれをどのように達成し始めますか? – arynhard

+0

ところで、私はあなたの答えを投票することはできませんので、私はオーバーフローのスタックに新しいです。まもなく私はできます。 – arynhard

+0

@AndrewRynhard私の新しい編集を見てください。あなたの質問に答える限り、心配はありません。私はポイントを得るでしょう:) –

関連する問題