我为MusicBackground创建了一个单例。我收到了一行@implementation MyBgMusic的完整实现的行代码。谁能告诉我为什么?以下是代码:
#import "MyBgMusic.h"
static MyBgMusic *sharedMyManager = nil;
@implementation MyBgMusic
@synthesize player,playBgMusic;
#pragma mark -
#pragma mark Singleton Methods
+ (MyBgMusic*)sharedInstance {
static MyBgMusic *_sharedInstance;
if(!_sharedInstance) {
static dispatch_once_t oncePredicate;
dispatch_once(&oncePredicate, ^{
_sharedInstance = [[super allocWithZone:nil] init];
});
}
return _sharedInstance;
}
+ (id)allocWithZone:(NSZone *)zone {
return [self sharedInstance];
}
- (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
- (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];
}
@end
对于M文件,下面是代码:
#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
我如何参考我的切换按钮:下面是代码:
- (IBAction)toggleMusic {
if ([self.player isPlaying] == YES) {
[self.player stop];
} else {
[self.player play];
}
self.playBgMusic.enabled = YES;
}
答案 0 :(得分:1)
这意味着您的MyBgMusic
类未执行其承诺在其头文件中执行的所有操作,其中包括UIViewController
并实施AVAudioPlayerDelegate
协议。我不熟悉AVAudioPlayerDelegate
究竟是什么,但你的类很可能没有实现所有必需的方法。
此外,您正在声明方法+(id)sharedManager
和-(IBAction)toggleMusic
,但我在实现文件中的任何位置都没有看到它们。这将是一个在标题中承诺某些内容而不是在类中实现它的情况。
如果您发布了实际的错误消息,那将会有所帮助。
答案 1 :(得分:0)
您的+(id)sharedManager
实施称为+(id)sharedInstance
。只是猜测,但似乎他们应该这样做。
答案 2 :(得分:0)
该错误表示您的@implementation
部分未包含@interface
部分中描述的所有内容。
我可以看到两个问题。
首先,您需要放置此代码:
- (IBAction)toggleMusic {
...
}
介于@implementation
和@end
之间的某个地方。
您还需要将行+ (MyBgMusic*)sharedInstance
重命名为+ (id)sharedManager
。
编辑:
要访问代码中其他位置的切换音乐方法,您可以执行以下操作:
[[MyBgMusic sharedManager] toggleMusic];