2011-11-14 2 views
4

私は3つのUIViewsはスタッキングUITableViewsは、そのビューの下のタッチイベントを渡しません

テーブルビューが下部にトップとrootViewにある別の

のUITableView
planeView
rootViewの上に積み重ねたのです。私は、これらの機能は、すなわちテーブルビュー最上位のビューがタッチされたときに呼び出されるまたは移動されることを期待し

/*code in rootView*/ 



- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {} 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {} 

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {} 

rootViewに次のコードを実装している

(テーブルビューがそれの上にあるようrootViewは表示されません)それどころか、機能のどれも呼ばれなかった。

予想通りrootView方法が

/*code in TableView so that the rootView methods are called(TableView is the subview of rootView)*/ 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
[super touchesBegan:touches withEvent:event]; 
[self.superview touchesBegan:touches withEvent:event]; 
} 

と呼ばれているように、私はまた、テーブルビューで次のコードを入れてみました、それはそのようにしたが、問題は

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath  

のようなテーブルビューのデリゲートがないということですと呼ばれる。

TableViewクラス(didSelectRow :)とtouchesBegan:に実装されたTableViewデリゲートが確実に保証される方法はありますか?touchesMoved .. rootViewの関数もそれに応じて呼び出されますか?

つまり、TableViewをクリックすると、 - > TableViewの(didSelectRow:atIndex)関数と - > rootViewの(touchesBeganおよびtouchesEnd)メソッドが呼び出されます。ここでの違いは、あなたの代わりにスーパーの次のレスポンダにタッチを渡している、とあなたがこれをやっているということです

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [self.nextResponder touchesBegan:touches withEvent:event]; 
    [super touchesBegan:touches withEvent:event]; 
} 

答えて

5

UITableViewのサブクラスでは、このようなタッチメソッドを持っていなければなりませんの前にスーパーにタッチを渡す。

次にplaneViewにあなたは、このようなタッチを渡す必要があります。

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [self.superview touchesBegan:touches withEvent:event]; 
} 

は、あなたが期待するよう、これはまだ正確に動作しない場合があることに注意してください。 UITableViewは、実際にはサブビューの複雑なコレクションであるUITableViewがボタンやラベルのような別のビューであるかのように見えるように、フードの下のレスポンダーチェーンのマングリングをたくさんします。

+0

素晴らしいのですが、助けてくれてありがとう – prajul

+0

まだtouchesEnded:は呼び出されていませんtouchesEnded:メッセージでビューの位置を調整しましたが、メッセージが常に渡されないため、ビューの調整は私は期待どおりに動作しません。 – prajul

+0

@prajul:ええ、私は現在、同様の問題を抱えています。テーブルビューは本当に複雑な獣です。基本的なタッチを使用しているかどうかに応じて、私が試した別のことは、テーブルビューの上に透明なUIViewを配置することです。上記のコードのような接触を通過すると、テーブルビューはまだ正しく動作しません(クリックすることはできますが、スクロールすることはできません)。しかし、代わりに 'hitTest:withEvent:'を渡すと、テーブルビューは通常のように動作し、オーバーレイのuiviewの最初のhitTestを使用して、ボタンをクリックするか何かを行うことができます。 – MusiGenesis

関連する問題