0

uibuttons を使用してグリッド ビューを作成しましたが、クリック時にボタンを選択および選択解除する必要があります。すべて正常に動作していますが、ボタンのクリックでサウンドを再生しようとすると、コンソールに以下のメッセージが出力されてアプリがクラッシュします。

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIButton prepareToPlay]: unrecognized selector sent to instance 0x7526a20'

サウンドを再生するには、AVAudioPlayer claas のオブジェクトを .h ファイルで取得し、それをビューで初期化してロード メソッドを実行し、ボタン クリックで再生しました。これが私のコード .h ファイルです。

#import <UIKit/UIKit.h>
#import <AVFoundation/AVAudioPlayer.h>
#import <AudioUnit/AudioUnit.h>

@interface PlayViewController : UIViewController<AVAudioPlayerDelegate>
{
    IBOutlet UIButton *resetBtn;
    UIButton *btn[25];
    AVAudioPlayer *tapSound;

}
-(IBAction)reserBtnClkd;
@property(nonatomic,retain) AVAudioPlayer *tapSound;

@end
in .m file
- (void)viewDidLoad
{
    [super viewDidLoad];
    [self.view setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"background.png"]]];
     NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    NSString *path=[[NSBundle mainBundle] pathForResource:@"button-3" ofType:@"wav"];
    AVAudioPlayer *Tapsound=[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
    self.tapSound=Tapsound;
    [Tapsound release];
    [pool release];
    [self setTheIcons];
    resetBtn.layer.cornerRadius=6.0;
    resetBtn.backgroundColor=[UIColor colorWithRed:90/255.00 green:33.00/255.00 blue:179.00/255.00 alpha:1];
    resetBtn.titleLabel.font=[UIFont fontWithName:@"Helvetica" size:22];
    [resetBtn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
}

#pragma mark
#pragma mark<Creating The Grid View Of Icons>
#pragma mark

-(void) setTheIcons
{
    int x=11;
    int y=55;

    for(int i=1;i<=25;i++)
    {
        btn[i]=[UIButton buttonWithType:UIButtonTypeCustom];
        btn[i].frame=CGRectMake(x, y, 58,58);
        [btn[i] addTarget:self action:@selector(btnClkd:) forControlEvents:UIControlEventTouchUpInside];
        [self.view addSubview:btn[i]];

        if(i%5==0)
        {
            x=11;
            y=y+60;
        }
        else
        {
            x=x+60;
        }
    }
    [self reserBtnClkd];
}

-(void)btnClkd:(UIButton*)sender
{
    sender.selected=!sender.selected;

    if(sender.selected)
    {
       // UIView *tempView=[[UIView alloc]initWithFrame:CGRectMake(12, 12, 34, 34)];
        UIView *tempView=[[UIView alloc]initWithFrame:CGRectMake(0, 0, 58, 58)];
        tempView.backgroundColor=[UIColor colorWithPatternImage:[UIImage imageNamed:@"hover-effectNew.png"]];
        tempView.userInteractionEnabled=NO;
        [sender addSubview:tempView];
        [tempView release];
    }
    else
    {
        NSArray *subviewToRemove=[sender subviews];
        int i=1;
        for(UIView *view in subviewToRemove)
        {
            if(i==2)
            {
            [view removeFromSuperview];
            }
            i++;
        }
    }
    [self.tapSound prepareToPlay];
    [self.tapSound setDelegate:self];
    [self.tapSound play];

}

そして奇妙なことは、ボタンクリックメソッドでサウンドを再生するときにのみアプリがクラッシュすることです.それ以外の場合は、ビューで再生するとロードされ、問題なく動作します.2日間頭を悩ませましたが、解決策が見つかりませんでした.助けてください.自分

4

2 に答える 2

0

self.tapSound問題はあなたがであるということだと思いますUIButton(クラッシュログでそれを見ることができます:'-[UIButton prepareToPlay]: unrecognized selector sent to instance 0x7526a20'

ステップバイステップでデバッグしてみて、何が起こるかを確認してください

于 2012-09-26T06:54:44.550 に答える
0

self.tapSoundを参照Tapsoundしているため、呼び出す[Tapsound release]とプロパティも解放されると思います。次のように、プロパティを直接インスタンス化することをお勧めします。

/*note that you have declared tapSound in your .h 
as a class variable in addition to being a property.
This means you can access it as both.
Wherever you would type self.tapSound, instead use simply tapSound
*/

tapSound = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
于 2012-09-26T07:35:55.460 に答える