为什么Xcode说我的课程实现不完整?

时间:2011-12-10 08:00:59

标签: objective-c ios5 singleton

我为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;

}   

3 个答案:

答案 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];