2013-06-14 3 views
0

델리게이트를 사용하여 다른보기에서 내 음악 재생을 멈추고 싶습니다. 이미 설정이되어 있고이 옵션이 있다는 것을 알고 있습니다. ...ObjectiveC : Xcode의 다른보기에서 음악 플레이어를 중지하는 방법?

그러나 전 음악을 재생하므로이 기능을 사용하고 싶지 않습니다. 플레이어가 겹치지 않도록 코드를 이미 추가했습니다. 하지만 내 음악을 멈추고 싶을 때 나는 다른 관점에서 그렇게하고 싶다. 위임자가 호출되었지만 작동하지 않을 때 '[player stop];' 함수를 시도했습니다.

아무도 도와 줄 수 있습니까? 고급의 감사합니다 ...

EDIT 여기

내 옵션의 PAGE.H 파일에 대한 코드입니다 :

여기
@protocol onHandlerDelegate <NSObject> 

- (void)off:(BOOL)success; 
- (void)on:(BOOL)success; 
-(void)volumeValueChange:(UISlider *)sender; 

@end 

#import <UIKit/UIKit.h> 


@interface OptionsPage : UIViewController{ 


    IBOutlet UISlider *VolumeSlider; 
    NSTimer *VolumeTimer; 
    IBOutlet UISwitch *onoroffmusic; 

} 
-(IBAction) UIBarButtonItem:(id)sender; 
-(IBAction) SwitchMusic:(id)sender; 
-(IBAction)changevolume:(id)sender; 
@property (nonatomic, retain) UISwitch *onoroffmusic; 
@property (nonatomic, strong) id<onHandlerDelegate> delegatePpty1; 


@end 

내 옵션 페이지하는 .m 파일입니다

#import "OptionsPage.h" 
#import "ViewController.h" 

@interface OptionsPage() 

@end 


@implementation OptionsPage 
@synthesize onoroffmusic; 
@synthesize delegatePpty1; 

- (IBAction)changevolume:(id)sender{ 
    int volume = VolumeSlider.value; 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    [defaults setObject:[NSNumber numberWithInt:volume] forKey:@"volume"]; 
    [defaults synchronize]; 
    [[self delegatePpty1]volumeValueChange:(VolumeSlider)]; 
} 
-(IBAction) SwitchMusic:(id)sender{ 
    if (onoroffmusic.on) { 
     [[self delegatePpty1] on:YES]; 
     printf("done"); 
     onoroffmusic.on = YES; 
     NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
     [defaults removeObjectForKey:@"off"]; 
     [defaults setObject:[NSNumber numberWithBool:YES] forKey:@"on"]; 
     [defaults synchronize]; 
    } 
    else { 
     /// do nothing 
     [[self delegatePpty1] off:YES]; 
     printf("off"); 
     onoroffmusic.on = NO; 
     NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
     [defaults removeObjectForKey:@"on"]; 
     [defaults setObject:[NSNumber numberWithBool:YES] forKey:@"off"]; 
     [defaults synchronize]; 
     ViewController *home = [[ViewController alloc] initWithNibName:nil bundle:nil]; 
     [home.player stop]; 

    } 
} 



-(IBAction) UIBarButtonItem:(id)sender{ 

    ViewController *Backbutton = [[ViewController alloc] initWithNibName:nil bundle:nil]; 
    [self presentViewController:Backbutton animated:YES completion:nil]; 

} 





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

- (void)viewDidLoad{ 
    VolumeSlider.value = 0.3; 
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
    NSObject * object = [prefs valueForKey:@"volume"]; 
    if(object == nil){ 
     VolumeSlider.value = 0.3; 
    } 
    else{ 
     VolumeSlider.value = [[[NSUserDefaults standardUserDefaults] objectForKey:@"volume"] intValue]; 

    } 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view from its nib. 
    NSUserDefaults *defaults2 = [NSUserDefaults standardUserDefaults]; 
    BOOL restoredBoolValue2 = [[defaults2 objectForKey:@"off"] boolValue]; 
     BOOL restoredBoolValue1 = [[defaults2 objectForKey:@"on"] boolValue]; 
    if (restoredBoolValue2) { 
     ////donothing 
     onoroffmusic.on = FALSE; 
    } 
    if (restoredBoolValue1) { 
     ////donothing 
     onoroffmusic.on = TRUE; 
    } 

} 

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

@end 

위니 n 두 파일 내가 델리게이트와 스위치를 선언합니다. 지금은 그냥 내보기 컨트롤러에 대리자를받을 :

MY VIEWCONNTROLLER .H 파일 : 첫째로 내가

@synthesize player; 

다음 확인

: 여기

#import "OptionsPage.h" 

@interface ViewController : UIViewController <onHandlerDelegate>{ 
    AVAudioPlayer *player; 

} 
@property (nonatomic, retain) AVAudioPlayer *player; 

@end 

는 MY하는 .m 파일입니다 내 대표가 다음을 사용하여 호출 된 경우 :

-(void)volumeValueChange:(UISlider *)sender 
{ 

    if (sender.value > 0.3) { 
     player.volume = sender.value; 

    } 
    else{ 
     player.volume = 0.3; 
    } 
} 
-(void)on:(BOOL)success{ 
    NSLog(@"Delegate Method Called"); 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    [defaults setObject:[NSNumber numberWithBool:YES] forKey:@"mykey1"]; 
    [self play]; 
    [player play]; 
} 

-(void)off:(BOOL)success{ 
    NSLog(@"Delegate Method Called"); 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    [defaults removeObjectForKey:@"mykey1"]; 
    [defaults setObject:[NSNumber numberWithBool:YES] forKey:@"mykey"]; 
    [player stop]; 
    player = nil; 
    [defaults removeObjectForKey:@"music"]; 


} 

나는 다음이 사용하여 내 nsuserdefultsbool 값을로드 :

- (void)viewDidLoad 
{ 
    if ([[NSUserDefaults standardUserDefaults] stringForKey:@"mykey"] == nil) { 

     if ([[NSUserDefaults standardUserDefaults] stringForKey:@"music"] == nil) { 

     [self play]; 
    } 

    } 
} 
NSUserDefaults *defaults2 = [NSUserDefaults standardUserDefaults]; 
BOOL restoredBoolValue2 = [[defaults2 objectForKey:@"mykey"] boolValue]; 
if (restoredBoolValue2) { 
    ////donothing 
    [player stop]; 
} 
BOOL restoredBoolValue1 = [[defaults2 objectForKey:@"mykey1"] boolValue]; 
if (restoredBoolValue1){ 
    [self play]; 
} 

을 그리고 난 내 플레이 void 기능이 내 응용 프로그램 delegate.m 파일

-(void)play{ 

    if ([[NSUserDefaults standardUserDefaults] stringForKey:@"music"] == nil) { 
    NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/Music.mp3", [[NSBundle mainBundle] resourcePath]]]; 
    NSError *error; 
    player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error]; 
    player.numberOfLoops = -1; 
     [player play]; 
     player.volume = 0.3; 
     player.currentTime = 0.0; 
     [[NSUserDefaults standardUserDefaults] setObject:@"-" forKey:@"music"]; 


    } 
    else { 

     [player stop]; 
    } 

} 

그리고 마지막으로 내가 :

- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 
    // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 
    // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 
     [[NSUserDefaults standardUserDefaults] setObject:nil forKey:@"music"]; 

} 
+0

이 질문이 Xcode와 관련이 있다고 생각하는 이유는 무엇입니까? – mah

답변

1

플레이어를 속성으로 만들고 다음과 같이 중지하십시오.

[anotherView.player stop]; 
+0

내가 준 코드는 작동하지만 내 설정보기와 내 집보기가 있고 가정보기는 음악을 재생합니다.집보기를 종료하고 설정보기로 이동하여 음악을 끕니다. 그래서 다시 켜고 집보기로 다시 들어갑니다. 음악이 다시 재생되고 있지만 설정보기에 다시 들어가서 음악을 끄면 아무 것도하지 않습니다. 음악은 – user2425997

+0

을 계속합니다. 다른 이유로 인해 발생할 수 있습니다. 코드를 보지 않아도 확신 할 수 없습니다. –

+0

그러나 어떤보기에서 음악을 묶어 단레 톤 클래스로 만들면 더 좋을 것입니다. –

-1

먼저 onHandlerDelegatestrong에서 weak으로 변경해야합니다. 위임자이기 때문입니다.

두 번째보기 컨트롤러에서 OptionsPage의 인스턴스가 필요하며 위임자를 구현하고이 작업을 수행 한 후에 optionPage.delegate = self을 수행해야합니다.

관련 문제