2012-02-24 16 views
3

以下のようにプログラムでビューとボタンを追加したいと思います。プログラムでボタンを使用してビューを追加する

問題は、ボタンがクリックしても反応しないということです。私はどちらも強調表示されていないか、セレクタを呼び出していないことを意味します。

なぜなら、録音用のリスト行(サウンドファイル)を実装したいからです。リスト行はドリルダウンのために選択可能で、再生ボタンが必要です。だから私はUIViewをサブクラス化するRecordingViewを得て、コンストラクタのターゲットを使ってボタンを追加します。以下のコードを参照してください。

listrow

誰も解決策になる可能性があり、これを行うためのより良い方法を持っている場合。

@implementation MyViewController

- (IBAction) myAction { 
    RecordingView *recordingView = [[RecordingView alloc] initWithFrame:CGRectMake(30, 400, 130, 50)withTarget:self]; 
    [recordingView setUserInteractionEnabled:YES]; 
    [[self view] addSubview:recordingView]; 
} 

@implementation RecordingView

- (id)initWithFrame:(CGRect)frame withTarget:(id) target 
{ 
    self = [super initWithFrame:frame]; 

    UIButton *playButton = [[UIButton alloc] initWithFrame:CGRectMake(185, 5, 80, 40)]; 
    [playButton setTitle:@"Play" forState:UIControlStateNormal]; 
    [playButton setTitleColor:[UIColor darkTextColor]forState:UIControlStateNormal]; 
    // creating images here ... 
    [playButton setBackgroundImage:imGray forState: UIControlStateNormal]; 
    [playButton setBackgroundImage:imRed forState: UIControlStateHighlighted]; 
    [playButton setEnabled:YES]; 
    [playButton setUserInteractionEnabled:YES]; 
    [playButton addTarget: target 
        action: @selector(buttonClicked:) 
     forControlEvents: UIControlEventTouchDown]; 

    [self addSubview:playButton]; 

    return self; 
} 

私はボタンを同じように追加すると、直接のView Controllerの.mファイルで、ボタンがクリックに反応しません。したがって、RecordingViewについては何かがあります。ここで違う何をする必要がありますか?

さらに、タッチイベントのターゲットとセレクタを提供するためのより良い方法はありますか?

+0

実際のコードですか? 2つのUIImage変数(imGreyとimRed)はどこで宣言されていますか?あなたはイニシャルメソッドを使っているので、イナールにすることはできません。あなたの質問に関連して、あなたは録音のリストが必要だと言います - あなたはテーブルビューの後ですか?録画ビューは代わりに表のセルのサブクラスにできますか? – jrturton

+0

本当に、私はイメージの作成のためのコードを省いた。これは私の実際のコードですが、簡単にするために投稿時には削除しています。私はこれを明らかにするでしょう。はい、録画ビューは代わりに表のセルになります。私はコードからiOSのUIを構築するのが初めてです。これは私の最初のものなので、今後の方向性は大歓迎です。:) – JOG

+0

@jrturton:はい、私はこのコードをUITableViewDelegateの ' - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath'メソッドで使用する予定です。 ...私はそれが動作するようになると、それはあります。 ^^ – JOG

答えて

5

RecordingViewuserInteractionEnabledYESと設定するだけでよいでしょう。

別の問題は、130のフレームの幅とRecordingViewを作成していることですが、185にplayButtonのX軸原点を設定しているこれはplayButtonが完全そのスーパーの境界の外にあることを意味します。 clipsToBoundsのデフォルト値はNOなので、ボタンはとにかく描画されます。しかし、タッチイベントは、システムがRecordingViewをヒットテストしたときに拒否されるため、ボタンに到達しません。

これはUIView Class ReferencehitTest:withEvent:ドキュメントからです:レシーバの境界外にある

ポイントは、彼らが実際に受信機のサブビューの1内にある場合でも、ヒットとして報告されることはありません。これは、現在のビューのclipsToBoundsプロパティがNOに設定され、影響を受けるサブビューがビューの境界を超えて拡張されている場合に発生します。

あなたはRecordingViewの枠を広く作る、またはそのスーパービューの境界内であることをplayButtonを移動するのいずれかが必要です。

+0

いいえ、うまくいきませんでした。私は質問コードを更新しています。 – JOG

+0

私は私の答えを修正しました。 –

+0

それはあまりにも幅があった – JOG

関連する問題