6

私は3つのUIViewを積み重ねています

UITableview
planeView
rootView

TableView が上部にあり、rootView が下部にあります。(TableView がその上にあるため、rootView は表示されません)

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 {} 

一番上のビュー、つまりTableViewがタッチまたは移動されたときにこれらの関数が呼び出されることを期待していますが、逆に関数は呼び出されませんでした。

rootViewメソッドが呼び出されるように、次のコードをTableViewに入れてみました

 /*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];
 }

予想通りそうしましたが、問題はTableViewデリゲートが好きなことです

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

呼び出されません。

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

つまり、TableCell をクリックすると、(didSelectRow:atIndex) 関数が --> TableView に、(touchesBegan および touchesEnd) メソッドが -->rootView に呼び出されます。

4

2 に答える 2

6

のサブクラスには、次のUITableViewような touch メソッドが必要です。

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

ここでの違いは、タッチをスーパービューではなく次のレスポンダーに渡していることと、タッチをスーパーに渡す前にこれを行っていることです。

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

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

これでも期待どおりに動作しない可能性があることに注意してください。(実際にはサブビューの複雑なコレクションです)がボタンやラベルのような単なる別のビューであるUITableViewかのように見せるために、ボンネットの下でレスポンダーチェーンの多くのマングリングを行います。UITableView

于 2011-11-14T20:43:42.627 に答える