2009-05-04 14 views
11

これはとても簡単です。私は何かを逃して、それを修正しようとして疲れてしまった。うまくいけば誰かが助けることができるネストされたUIViewでIphone UIButtonが動作しない

CharacterView.mのボタンは機能しますが、CharacterMale.mのネストされたボタンは表示されません。私はIBを使用していないので、すべてがプログレッシブに行われます。 1つのボタンが動作する原因は何ですか?

///////////////////////////////////////////////////////////////////////////////// 
CharacterController.m 
///////////////////////////////////////////////////////////////////////////////// 
#import "CharacterController.h" 
#import "CharacterView.h" 

@implementation CharacterController 

- (id)init { 
    NSLog(@"CharacterController init"); 
    self = [ super init ]; 
    if (self != nil) { 
    } 
    return self; 
} 

- (void)loadView { 
    [ super loadView ]; 
    characterView = [ [ CharacterView alloc ] init]; 
    self.view = characterView; 
} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
} 


- (void)dealloc { 
    [super dealloc]; 
} 

@end 

///////////////////////////////////////////////////////////////////////////////// 
CharacterView.m 
///////////////////////////////////////////////////////////////////////////////// 

#import "CharacterView.h" 
#import "CharacterMale.h" 

@implementation CharacterView 

- (id)initWithFrame:(CGRect)frame { 
    if (self = [super initWithFrame:frame]) { 
     characterMale = [ [ CharacterMale alloc ] init]; 
     [self addSubview: characterMale]; 

     UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 
     button.frame = CGRectMake(0, 200, 200, 100); 
     [button setImage:[UIImage imageNamed:@"btnCharSelect.png"] forState:UIControlStateNormal]; 
     [button addTarget:self action:@selector(ApplyImage:) forControlEvents:UIControlEventTouchUpInside]; 
     [ self addSubview: button ]; 
    } 
    return self; 
} 

- (void)drawRect:(CGRect)rect { 
} 

-(void)ApplyImage:(id)sender 
{ 
    NSLog(@"CharacterView button works"); 
} 

- (void)dealloc { 
    [super dealloc]; 
} 

@end 

///////////////////////////////////////////////////////////////////////////////// 
CharacterMale.m 
///////////////////////////////////////////////////////////////////////////////// 

#import "CharacterMale.h" 
#import "CharacterController.h" 

@implementation CharacterMale 

- (id)init { 
    self = [ super init]; 
    if (self != nil) { 
     UIImage *image = [UIImage imageNamed:@"charMale.png"]; 
     imageView = [[ UIImageView alloc] initWithImage:image]; 
     [image release]; 
     [ self addSubview: imageView ]; 

     UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 
     button.frame = CGRectMake(0, 0, 200, 100); 
     [button setImage:[UIImage imageNamed:@"btnCharSelect.png"] forState:UIControlStateNormal]; 
     [button addTarget:self action:@selector(ApplyImage:) forControlEvents:UIControlEventTouchUpInside]; 
     [ self addSubview: button ]; 

    } 
    return self; 
} 

-(void)ApplyImage:(id)sender 
{ 
    NSLog(@"CharacterMal button works"); 
} 

- (void)dealloc { 
    [super dealloc]; 
} 

@end 
+0

ボタンが機能しなくなるということを意味しますか?これらは有効になっていますが、セレクタを呼び出さないか、まったくクリックできません。セレクタにどのように接続しますか? IBを使用している場合は、アウトレットと接続を確認してください – nduplessis

+1

ボタンをクリックできない場合は何も起こりません。私がViewクラスを取る場合、そのボタンはその親の外に位置しています。私はIBを使用していません。私はボタンを使用して接続します:[button addTarget:自己アクション:@ Selector(ApplyImage :) forControlEvents:UIControlEventTouchUpInside];もう一度別のビューにネストされていないときはうまく動作します。 –

+0

私は3つすべてのクラスを投稿しました。助けてもらえますか? –

答えて

17

最後に!!!!!!

initWithFrameですべてのビューを初期化し、有効なフレーム矩形を渡す必要がありました。 UIViewsのコントローラとinitWithFrameを使ってinitを使うべきです!

characterView = [ [ CharacterView alloc ] initWithFrame:CGRectMake(0, 0, 480, 320)]; 
then 
characterMale = [ [ CharacterMale alloc ] initWithFrame:frame]; 
+11

@Roger他の人が同じ問題を抱えている可能性があるためです。あなたは解決されたときに質問を削除するだけではありません... – Emil

2

新しいビューではユーザーの操作が許可されますか?言い換えると、ビュー "文字"でuserInteractionEnabledを有効にしていますか?

+0

私はuserInteractionEnabledを読んだと思っていましたが、デフォルトでYESです。このような状況では、CharactersViewクラスのuserInteractionEnabled = NOにすると思います。私はこのビューが何とか私のCharactersMaleクラスのボタンをブロックしていると思う。いずれにしても、私は試しても違いはありません。 –

+1

私は、たくさんのボタンを含むビューを持っています。私はそこにあったものの上にいくつかの独自のボタンを追加して新しいビューを追加します。第1層と第2層の間のボタンを含むすべてのボタンが機能します。だから私はボタンを入れ子にしても問題はありません。 スーパーレイヤーでuserInteractionをオフにすると、すべてのボタンの動作が停止します。最上位レイヤーのuserInteractionのみをオフにすると、そのレイヤーのボタンのみが無効になります。 こちらをご覧ください。私はあなたが単純なエラーかそれほど見つけるだろうと確信しています。 – mahboudz

17

もう1つ考慮する必要がありますUIButtonサブビュー追加されたUIImageViewはまったく動作しません。画像ビューとボタンの両方を追加するUIViewを作成する必要があります。

これは、画像ビューでデフォルトでインタラクションがオフになっている可能性がありますが、これはチェックしていません。

+2

ケイ、アドバイスありがとうございます。私はUIImageView suerInteractionEnabledをyesに設定し、うまくいきました。 –

+0

+1ありがとう、奇妙な問題を解決しました – Kalle

1

CGRectZeroのフレームとのUIViewの初期化中にボタンを追加しようとしたとき、私は同様の問題があった:

@implementation SomeView 
... 
- (id)initWithTitleImage:(UIImage *) newTitleImage { 
    // BROKEN: frame with CGRectZero. 
    self = [super initWithFrame:CGRectZero]; 
    if (self) { 
    UIButton *someButton = ...; 
    [self addSubview someButton]; 
    } 
} 

私は適切な矩形に枠を変更すると、ボタンが働いた:

@implementation SomeView 
... 
- (id)initWithTitleImage:(UIImage *) newTitleImage { 
    // WORKING: frame with proper CGRect. 
    self = [super initWithFrame:CGRectMake(0, 0, 480, 320)]; 
    if (self) { 
    UIButton *someButton = ...; 
    [self addSubview someButton]; 
    } 
} 
1

普段のUIControlEventTouchUpInsideではなく、UIControlEventTouchDownを使用してdrawRectで作成されたUIButtonのセレクタを使用していました。

1

問題は、ボタンフレームの原点が親フレームより大きかったためです。

関連する問題