iOS: как ссылаться на музыкальный фон из синглтон-класса? - PullRequest
0 голосов
/ 10 декабря 2011

Я создал одноэлементный класс MyBgMusic.h & MyBgMusic.m. Как ссылаться на этот одноэлементный класс на мой SecondViewController или на остальную часть XIB.

Вот мой синглтон-класс:

H файл:

#import <Foundation/Foundation.h>
#import <AVFoundation/AVAudioPlayer.h>

@interface MyBgMusic : UIViewController <AVAudioPlayerDelegate> {


    AVAudioPlayer *player;
    UIButton *playBgMusic;


}

@property (nonatomic, retain) IBOutlet AVAudioPlayer *player;
@property (nonatomic, retain) IBOutlet UIButton *playBgMusic;


+ (id)sharedManager;

-(IBAction) toggleMusic;


@end

М файл:

#import "MyBgMusic.h"

static MyBgMusic *sharedMyManager = nil;

@implementation MyBgMusic

@synthesize player,playBgMusic;

#pragma mark -
#pragma mark Singleton Methods

+ (MyBgMusic*)sharedManager {

    static MyBgMusic *sharedMyManager;
    if(!sharedMyManager) {
        static dispatch_once_t oncePredicate;
        dispatch_once(&oncePredicate, ^{
            sharedMyManager = [[super allocWithZone:nil] init];
            });
        }

        return sharedMyManager;
}

+ (id)allocWithZone:(NSZone *)zone {    

    return [self sharedManager];
}


- (id)copyWithZone:(NSZone *)zone {
    return self;    
}

#if (!__has_feature(objc_arc))

- (id)retain {  

    return self;    
}

- (unsigned)retainCount {
    return UINT_MAX;  //denotes an object that cannot be released
}


- (id)autorelease {

    return self;    
}

- (void)dealloc
{
    [MyBgMusic release];
    [playBgMusic release];
    [player release];
    [super dealloc];
}
#endif

#pragma mark -
#pragma mark Custom Methods

- (IBAction)toggleMusic {

    if ([self.player isPlaying] == YES) {
        [self.player stop]; 
    } else {
        [self.player play];
    }
    self.playBgMusic.enabled = YES;

}

- (void)viewDidLoad
{

    NSString *path = [[NSBundle mainBundle] pathForResource:@"music" ofType:@"mp3"];
    self.player=[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL]; 
    player.delegate = self;
    [player play];
    player.numberOfLoops = -1;
    [super viewDidLoad];

    // Do any additional setup after loading the view from its nib.
}

SecondViewController.m (Я хочу сослаться на одноэлементный класс, чтобы я мог использовать его снова и снова, не мешая фоновой музыке при нажатии и выключении.)

- (IBAction)toggleMusic{

    if ([self.player isPlaying] == YES) {
        [self.player stop]; 
    } else {
        [self.player play];
    }
    self.playBgMusic.enabled = YES;

}

Должен ли я объявить так:

-(IBAction) sharedMusic {

    [[MyBgMusic sharedManager] toggleMusic]; // instance method shareManager not found. What does it mean?

}

Ответы [ 3 ]

0 голосов
/ 11 декабря 2011

В SecondViewController вы должны вызывать [[MyBgMusic sharedInstance] toggleMusic]; в IBAction, когда вы хотите переключать музыку. Так же, как вы использовали self.player.

0 голосов
/ 11 декабря 2011

Вы должны импортировать свой класс и ссылаться на него везде, где хотите, используя эту строку:

[[MyBgMusic sharedManager] toggleMusic]

Если хотите, вы можете добавить четное свойство и ссылаться на него, не создавая экземпляр вашего класса.

0 голосов
/ 10 декабря 2011

Создайте IBAction в вашем SecondViewController, подключите xib, затем в коде и затем вызовите его

[[MyBgMusic sharedInstance] toggleMusic];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...