Почему Xcode говорит, что моя реализация класса не завершена? - PullRequest
0 голосов
/ 10 декабря 2011

Я создал синглтон для моего 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

Для файла М ниже приведен код:

#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 ]

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

Это означает, что ваш класс MyBgMusic делает не все, что обещал сделать в своем заголовочном файле, который включает в себя UIViewController и реализацию протокола AVAudioPlayerDelegate.Я не знаю точно, что такое AVAudioPlayerDelegate, но вполне возможно, что ваш класс не реализует все необходимые методы.

Кроме того, вы объявляете методы +(id)sharedManager и -(IBAction)toggleMusic, но я не вижу их нигде в файле реализации.Это был бы случай обещания чего-либо в заголовке и не реализации этого в классе.

Было бы полезно, если бы вы опубликовали фактическое сообщение об ошибке.

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

Эта ошибка означает, что ваш раздел @implementation не содержит всего, что описано в разделе @interface.

Я вижу две проблемы.

Сначала вам нужно разместить этот код:

- (IBAction)toggleMusic {

    ...

}   

Где-то между @implementation и @end.

И вам также необходимо переименовать строку + (MyBgMusic*)sharedInstance в + (id)sharedManager.

РЕДАКТИРОВАТЬ:

Чтобы получить доступ к методу переключения музыки в другом месте вашего кода, вы должны сделать:

[[MyBgMusic sharedManager] toggleMusic];
0 голосов
/ 10 декабря 2011

Ваша реализация +(id)sharedManager называется +(id)sharedInstance. Просто догадываюсь, но похоже, что они должны делать то же самое.

...