Событие UIButtons Touch up Inside не работает должным образом?
Мой вопрос немного сложен, поэтому я разместил весь свой код, поэтому я прошу каждого, пожалуйста, протестируйте весь этот код, прежде чем дать мне ответ. Ответ
В моем приложении я создаю все UIButtons
программно, а затем сохранить все эти UIButtons
в NSMutableArray
, Вот мой код:-
-(void)button:(id)sender
{
int btnn = 0;
int spacex = 152;
int spacey=20;
int k=0;
saveBtn = [[NSMutableArray alloc] init];
for (int i=0; i<48; i++)
{
if (btnn>6)
{
spacey=spacey+25;
spacex = 152;
btnn = 0;
}
else
{
btnn++ ;
k++;
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
btn.frame = CGRectMake(spacex, spacey, 25.0, 25.0);
int idx;
idx = arc4random()%[arr count];
NSString* titre1 = [arr objectAtIndex:idx];
[btn setTitle: titre1 forState: UIControlStateNormal];
[btn setTitleColor: [UIColor yellowColor] forState: UIControlStateNormal];
[btn.titleLabel setFont:[UIFont fontWithName:@"TimesNewRomanPS-BoldMT" size:22.0]];
spacex = spacex + 25;
btn.tag=k;
[btn addTarget:self action:@selector(aMethod:)forControlEvents:UIControlEventTouchUpInside];
[saveBtn addObject:btn];
[self.view addSubview:btn];
}
}
}
Теперь в (aMethod:) Я добавляю звук щелчка на каждом UIButton
TouchUpInside
событие. Вот мой код
- (void)aMethod:(id)sender
{
NSString *path = [[NSBundle mainBundle] pathForResource:@"button-17" ofType:@"wav"];
AVAudioPlayer* theAudio=[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
theAudio.delegate=self;
[theAudio play];
}
Все работает нормально в начале моего приложения, но постоянно нажимая на UIButtons
Примерно после 100 щелчков я не слышу звук щелчка, и когда я нажимаю Далее UIButtons
Прикосновение к событию внутри его аварии. Может ли любое тело помочь мне в этом вопросе?
4 ответа
приложение из-за необученного исключения
NSInternalInconsistencyException
, причина: не удалось загрузить NIB в комплекте:NSBundle </Users/moon/Library/Application Support/iPhone Simulator/4.1/Applications/3E14E5D6-4D1B-4DAC-A2B9-07667E99C399/soundtesting.app> (loaded)
с именем второго класса
О да. То, что мы имеем здесь, это неспособность понять сообщения журнала. Ваш UIButton
, который я могу только предположить, выдвигает новый взгляд на стек, ссылается на NIB, который просто не существует. Это проблема с именами, а не кнопка. Скорее всего, я бы проверил любые звонки на -initWithNibName:
и посмотрите, действительно ли ваш NIB называется "secondclass". Помните, что имена файлов iOS - это CaSe SeNsITive.
//.h
...
@property (nonatomic, retain) AVAudioPlayer * player;
//.m
-(void)viewDidLoad
{
NSString *path = [[NSBundle mainBundle] pathForResource:@"button-17" ofType:@"wav"];
player=[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
player.delegate=self;
//in MRC, use [path release];
}
-(void)someMethod:(id)sender
{
[player play];
}
Причиной может быть утечка памяти при воспроизведении одного и того же звука много раз, это может привести к заполнению памяти при использовании этого кода для воспроизведения звука.
- (id)initWithNibName:(NSString*)nibName bundle:(NSBundle*)nibBundleOrNil
{
if (self = [super initWithNibName:nibName bundle:nibBundleOrNil]) {
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"button-17" ofType:@"wav"];
theAudio = [AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:filePath] error:NULL];
}
return self;
}
- (IBAction)playSound
{
[theAudio play];
}
- (void)dealloc
{
[theAudio release];
[super dealloc];
}
Я проверяю твой код. Изменения в вашем aMethod следуют коду. Хотя это я могу получить значение тега.
- (void)aMethod:(id)sender
{
UIButton *btn=(UIButton *)sender;
NSLog(@"\n\n\nselectedbutton tag === %d \n\n\n",btn.tag );
NSString *path = [[NSBundle mainBundle] pathForResource:@"button-17" ofType:@"wav"];
NSURL *url = [[NSURL alloc] initFileURLWithPath:path];
audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:NULL];
audioPlayer.delegate = self;
[audioPlayer prepareToPlay];
[audioPlayer play];
}
У вас проблема с памятью. Когда вы делаете:
- (void) aMethod: (id) отправитель { NSString *path = [[NSBundle mainBundle] pathForResource:@"button-17" ofType:@"wav"]; AVAudioPlayer* theAudio=[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] ошибка:NULL]; theAudio.delegate= самостоятельно; [theAudio play]; }
1 / путь никогда не освобождается
2/ TheAudio никогда не выпускается
Так что вам нужно освободить Аудио в методе делегата:
- audioPlayerDidFinishPlaying: успешно:
И вам нужно освободить путь так:
- (void) aMethod: (id) отправитель { NSString *path = [[NSBundle mainBundle] pathForResource:@"button-17" ofType:@"wav"]; AVAudioPlayer* theAudio=[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] ошибка:NULL]; theAudio.delegate= самостоятельно; [theAudio play]; [путь выпуска]; }
Я думаю, что ваша проблема должна быть решена.