0

デリゲートを使用して、別のビューから音楽の再生を停止したいと考えています。私はすでにその設定をしており、このオプションがあることを知っています...

- (void)viewWillDisappear:(BOOL)animated{

    [player stop]; ///(my players name here and command to stop the player)
}

ただし、音楽をずっと再生しているため、その機能を使用したくありません。プレーヤーが重複しないようにするコードを既に追加しています。でも、どうしても音楽を止めたい時は違う視点で止めたい。デリゲートが呼び出されたときに関数を試しましたが、'[player stop];'機能しません。

誰でも助けることができますか?高度なありがとう...

編集

これが私のオプション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

2 つのファイル内で、デリゲートとスイッチを宣言します。ビューコントローラーでそのデリゲートを受け取るだけです:

私のVIEWCONNTROLLER .Hファイル:

#import "OptionsPage.h"

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

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

@end

ここに私の.Mファイルがあります:

まず私は

@synthesize player;

次に、次を使用してデリゲートが呼び出されたかどうかを確認します。

-(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"];


}

次に、これを使用してboolmy の値をロードします。nsuserdefults

- (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機能を持っています

-(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];
     }

}

そして最後に、アプリの delegate.m ファイル i で:

- (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"];

}
4

2 に答える 2

-1

デリゲートであるため、最初にonHandlerDelegateからstrongに変更する必要があります。weak

次に、2 番目のビュー コントローラーに のインスタンスが必要でありOptionsPage、デリゲートを実装してoptionPage.delegate = selfそれを実行する必要があります。

于 2016-10-19T14:22:30.293 に答える