Укладка UITableViews не передает сенсорные события под его видом - PullRequest
6 голосов
/ 15 ноября 2011

У меня 3 UIViews сложены друг на друга

UITableView
PlaneView
rootView

TableView вверху и rootView внизу. (rootView не виден, так как TableView находится над ним)

Я реализовал следующий код в 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 будет затронуто или перемещено, но, напротив, ни одна из функций не была вызвана.

Я также попытался поместить следующий код в TableView, чтобы вызывать методы 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];
 }

Как и ожидалось, это так, но проблема в том, что делегаты TableView, такие как

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

не называются.

Есть ли способ гарантировать, что делегаты TableView, реализованные в классе TableView (didSelectRow :) и touchesBegan:, touchesMoved .., функции в rootView также будут вызываться соответственно?

т.е. когда я щелкаю на TableCell, вызываются обе функции (didSelectRow: atIndex) в -> TableView и метод (touchesBegan и touchesEnd) в -> rootView.

Ответы [ 2 ]

5 голосов
/ 15 ноября 2011

В вашем подклассе UITableView у вас должны быть такие методы касания:

- (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 (который на самом деле представляет собой сложную совокупность подпредставлений) - это просто другое представление, например кнопка или метка. 1015 *

0 голосов
/ 18 мая 2018

Ничего из этого не помогло мне

То, что решено было просто:

override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
    let view = super.hitTest(point, with: event)
    return view == self ? nil : view
}

Ref этой статье: https://medium.com/@nguyenminhphuc/how-to-pass-ui-events-through-views-in-ios-c1be9ab1626b

...