#iphone #objective-c #xcode #cocoa-touch
#iPhone #objective-c #xcode #cocoa-touch
Вопрос:
Хорошо, теперь я пытаюсь изменить громкость на ползунке
вот код
@implementation MainerViewController
@synthesize fxVolumeSlider;
- (IBAction)pushPlay:(id)sender; {
NSString *path = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"wav"];
if (theAudio) [theAudio release];
theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
theAudio.delegate = self;
[theAudio play];
volumeTimer = [NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(updateVolume) userInfo:nil repeats:YES];
}
-(void)updateVolume {
[theAudio setVolume:fxVolumeSlider.value];
}
- (void)viewDidLoad {
[super viewDidLoad];
// Setup custom slider images
UIImage *minImage = [UIImage imageNamed:@"grey_track.png"];
UIImage *maxImage = [UIImage imageNamed:@"white_track.png"];
UIImage *tumbImage= [UIImage imageNamed:@"metal_screw.png"];
minImage=[minImage stretchableImageWithLeftCapWidth:10.0 topCapHeight:0.0];
maxImage=[maxImage stretchableImageWithLeftCapWidth:10.0 topCapHeight:0.0];
// Setup the FX slider
[fxVolumeSlider setMinimumTrackImage:minImage forState:UIControlStateNormal];
[fxVolumeSlider setMaximumTrackImage:maxImage forState:UIControlStateNormal];
[fxVolumeSlider setThumbImage:tumbImage forState:UIControlStateNormal];
fxVolumeSlider.minimumValue = 0.0;
fxVolumeSlider.maximumValue = 1.0;
fxVolumeSlider.continuous = YES;
//fxVolumeSlider.value = [sharedSoundManager fxVolume];
// Attach an action to sliding
[fxVolumeSlider addTarget:self action:@selector(fxSliderAction:) forControlEvents:UIControlEventValueChanged];
// Cleanup
minImage = nil;
maxImage = nil;
tumbImage = nil;
}
- (void) fxSliderAction:(id)sender {
[theAudio setFxVolume:fxVolumeSlider.value];
}
Однако теперь я получаю эту ошибку
предупреждение: ‘AVAudioPlayer’ может не отвечать на ‘-setFxVolume:’
Итак, каждый раз, когда я нажимаю кнопку воспроизведения, я пытаюсь отрегулировать громкость, но меня выгоняют из приложения
Ответ №1:
Вы объявили и ivar, и свойство как _fxVolumeSlider
, но то, что вы используете в методе, является fxVolumedSlider
. Оба не совпадают. Вы должны использовать _fxVolumeSlider
или то, что вы, вероятно, имели в виду, это объявить свойство как
@property(retain, nonatomic) IBOutlet UISlider *fxVolumeSlider;
и синтезировать его с помощью
@synthesize fxVolumeSlider = _fxVolumeSlider;
Но даже тогда вы не сможете использовать его как fxVolumeSlider
. Вы можете использовать его как self.fxVolumeSlider
или _fxVolumeSlider
. Если вы хотите использовать его как обычный fxVolumeSlider
, вам следует заменить все _fxVolumeSlider
s на fxVolumeSlider
.
Комментарии:
1. Я думаю, что метод, который вы ищете, является
setVolume:
и неsetFxVolume:
.
Ответ №2:
Проверьте подчеркивание в объявлении. В файле .h у вас есть:
IBOutlet UISlider *_fxVolumeSlider;
У вас должен быть:
IBOutlet UISlider *fxVolumeSlider;
Кроме того, в файле .m отредактируйте строку
@synthesize _fxVolumeSlider;
чтобы быть
@synthesize fxVolumeSlider;
Что касается вашей исправленной проблемы:
- (void) fxSliderAction:(id)sender {
[theAudio setFxVolume:fxVolumeSlider.value];
}
вместо этого следует читать как
- (void) fxSliderAction:(id)sender {
[theAudio setVolume:fxVolumeSlider.value];
}
Следите за опечатками (и ищите их перед публикацией!)
Комментарии:
1. Хорошо, спасибо, теперь это работает, но пользовательский интерфейс не меняется, я связал его в interface builder
2. Сбросьте ссылки теперь, когда вы изменили объявленное имя (это то, что распознает IB).
3. Возможно, еще одна опечатка. Где вы объявили и синтезировали
fxVolume
?4. В верхней части .m
@implementation MainerViewController @synthesize fxVolumeSlider;
5. ОПЕЧАТКА :
fxVolume
не совпадает сfxVolumeSlider