3

私の質問は少しあいまいです。そのため、すべてのコードを投稿したので、Answer.Thanx を提供する前に、このコードをすべてテストしてください。

ここに画像の説明を入力

私のアプリケーションでは、UIButtonsプログラムですべてを作成してから、これらすべてを に保存UIButtonsNSMutableArrayます。これが私のコードです:-

-(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];
}

アプリケーションの開始時にすべてが正常に機能しますが、UIButtons100回クリックした後もほぼクリックし続けると、クリック音が聞こえず、UIButtonsイベント内で次のタッチアップをクリックするとクラッシュします。

4

4 に答える 4

2

キャッチされていない例外によるアプリNSInternalInconsistencyException、理由:バンドル内の NIB をロードできませんでした:NSBundle </Users/moon/Library/Application Support/iPhone Simulator/4.1/Applications/3E14E5D6-4D1B-4DAC-A2B9-07667E99C399/soundtesting.app‌​&gt; (loaded)名前が secondclassの場合

あ、はい。ここにあるのは、ログ メッセージを理解できていないことです。あなたのUIButtonは、新しいビューをスタックにプッシュするとしか思えませんが、単に存在しないNIBを参照しています。ボタンの問題ではなく、ネーミングの問題です。ほとんどの-initWithNibName:場合、NIB の名前が本当に「secondclass.」であるかどうかを確認します。iOS のファイル名は大文字と小文字が区別されることに注意してください。

//.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];
}
于 2012-06-27T07:19:22.437 に答える
1

同じオーディオを何度も再生するとメモリ リークが発生する可能性があるため、このコードを使用してオーディオを再生する

- (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];
}
于 2012-06-27T07:15:48.567 に答える
1

メモリに問題があります。あなたがするとき:

- (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;
    [オーディオ再生];
}

1/ パスが解放されない
2/ theAudio が解放されない

したがって、デリゲート メソッドで theAudio を解放する必要があります。

– audioPlayerDidFinishPlaying: 成功:

そして、次のようにパスを解放する必要があります:

- (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;
    [オーディオ再生];
    [パスリリース];
}

あなたの問題は解決されるべきだと思います。

于 2012-06-27T07:22:36.863 に答える
1

あなたのコードをテストします。コードに続く 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];   
}
于 2012-06-27T07:17:16.603 に答える