Сохранение переменных данных / экземпляра в представлении NavigationController - PullRequest
0 голосов
/ 27 августа 2010

У меня есть корневое представление и подробное представление, в подробном представлении находится AVAudioPlayer с базовой настройкой кнопки воспроизведения / паузы. Все работает, однако, если я проигрываю файл и затем щелкаю обратно (popViewControllerAnimated) в корне, файл продолжает воспроизводиться, что является правильным, но затем, если я нажимаю обратно в подробный вид, представление сбрасывается и не находит экземпляр AVAudioPlayer.

Деталь страницы.ч

@interface DetailPageViewController : UIViewController <AVAudioPlayerDelegate>{
UIButton *arrowBtn;
UIButton *playButton;
UIButton *pauseButton;
AVAudioPlayer *appSoundPlayer;
NSURL *soundFileURL;
BOOL playing ;
UILabel *timeLabel;
NSTimer *timer;
}

@property (nonatomic, retain) IBOutlet UIButton *arrowBtn;
@property (nonatomic, retain) IBOutlet UIButton *playButton;
@property (nonatomic, retain) IBOutlet UIButton *pauseButton;
@property (nonatomic, retain)   AVAudioPlayer *appSoundPlayer;
@property (nonatomic, retain)   NSURL *soundFileURL;
@property (nonatomic, retain)   IBOutlet UILabel *timeLabel;
@property (readwrite) BOOL playing;
@property (nonatomic, retain) NSTimer *timer;

-(IBAction)playPauseToggle:(id)sender;
-(IBAction)returnToRoot;

@end

Деталь страницы. М

@synthesize arrowBtn, playButton, pauseButton, playing, appSoundPlayer, soundFileURL, timeLabel, timer;

...

-(IBAction)playPauseToggle:(id)sender
{
if (playing == NO)
{
    [appSoundPlayer play];
    playing = YES;
    [playButton setHidden: YES];
    [pauseButton setHidden: NO];

}
else {
    [appSoundPlayer pause];
    playing = NO;
    [playButton setHidden: NO];
    [pauseButton setHidden: YES];
}
}

-(IBAction)returnToRoot
{
[self.navigationController popViewControllerAnimated:YES];
}

- (void)viewDidLoad {
[super viewDidLoad];

if (self.appSoundPlayer == nil)
{
    playing = NO;

    [playButton setHidden: NO];
    [pauseButton setHidden: YES];

    NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:@"soundFile" ofType:@"mp3"];

    NSURL *newURL = [[NSURL alloc] initFileURLWithPath: soundFilePath];
    self.soundFileURL = newURL;
    [newURL release];

    AVAudioPlayer *newPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL: soundFileURL error: nil];
    self.appSoundPlayer = newPlayer;
    [newPlayer release];

    [appSoundPlayer prepareToPlay];
    [appSoundPlayer setVolume: 1.0];
    [appSoundPlayer setDelegate: self];
}

}

Как мне сохранить appSoundPlayer или playing при повторном просмотре представления.

1 Ответ

2 голосов
/ 27 августа 2010

Вам потребуется сохранить ссылку на объект appSoundPlayer в вашем RootViewController и передать его каким-либо образом в подробный вид при загрузке.

На самом деле BOOL playing не требуется, посколькуэто свойство AVAudioPlayer , и вы можете получить к нему доступ в любое время.

RootViewController.h

@interface RootViewController : UIViewController {
    AVAudioPlayer *_appSoundPlayer;

// Declare the other iVars
}

@property (nonatomic, retain) AVAudioPlayer *appSoundPlayer;

@end

RootViewController.m

@synthesize appSoundPlayer = _appSoundPlayer;

- (void)dealloc {
    [self setAppSoundPlayer:nil];
    // Dealloc the other properties that you may have

    [super dealloc];
}
/*
** Your code
*/

// When presenting the detail view
- (void)openDetailView {
    DetailPageViewController *viewController = [[DetailPageViewController alloc] initWithParentViewController:self];
.
.
.
    // Present the view controller
}

На вашем DetailPageViewController.h

@interface DetailPageViewController : UIViewController <AVAudioPlayerDelegate> {
RootViewController *_parentViewController;
    // Declare the iVars
}

@property (nonatomic, assign) RootViewController *parentViewController;

- (id)initWithParentViewController:(RootViewController *)parentViewController;

@end

DetailPageViewController.m

@synthesize parentViewController = _parentViewController;

- (void)dealloc {
    // Set the delegate to nil
    [self.parentViewController.appSoundPlayer setDelegate:nil];

    // Dealloc the other properties that you may have

    [super dealloc];
}

- (id)initWithParentViewController:(RootViewController *)parentViewController {
    if (self = [super init]) {
        self.parentViewController = parentViewController;
    }
    return self;
}

- (void)viewDidLoad {
    [super viewDidLoad];

    if (self.parentViewController.appSoundPlayer == nil) {
        [playButton setHidden: NO];
        [pauseButton setHidden: YES];

        NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:@"soundFile" ofType:@"mp3"];

        NSURL *newURL = [[NSURL alloc] initFileURLWithPath: soundFilePath];
        self.soundFileURL = newURL;
        [newURL release];

        AVAudioPlayer *newPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL: soundFileURL error: nil];
        [newPlayer prepareToPlay];
        [newPlayer setVolume: 1.0];
        [newPlayer setDelegate: self];
        self.parentViewController.appSoundPlayer = newPlayer;
        [newPlayer release];
    }
}

Я не тестировал этот код, но вы можете иметь хорошее представление о том, что вам нужно будет сделать.Конечно, есть и другие способы сделать это.

...