Событие 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:) Я добавляю звук щелчка на каждом UIButtonTouchUpInside событие. Вот мой код

- (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];
    [путь выпуска];
}

Я думаю, что ваша проблема должна быть решена.

Другие вопросы по тегам