NavCtrl + TableViewCtrl + ScrollView,TableView 没有接触

Posted

技术标签:

【中文标题】NavCtrl + TableViewCtrl + ScrollView,TableView 没有接触【英文标题】:NavCtrl + TableViewCtrl + ScrollView, TableView not getting touches 【发布时间】:2011-07-05 05:25:15 【问题描述】:

我有一个 NavCtrl,最重要的是我有一个 TableView/ctrl,然后我有一个滚动视图。

我一切正常,但我似乎无法触摸到表格视图上的单元格。

我已经尝试了 nextResponder 的事情,一切似乎都在做正确的事情。这是一些sn-ps的代码,请记住,这段代码已经为测试做了很多改动,所以它还不是“干净”的:):


    ScrollView *myScrollView = [[ScrollView alloc] initWithFrame:CGRectMake(0, 150, 320, 680)];
    myScrollView.contentSize = CGSizeMake( 320 , 888);
    myScrollView.pagingEnabled = NO;
    myScrollView.bounces = NO;
    myScrollView.directionalLockEnabled = YES;
    myScrollView.canCancelContentTouches = NO;
    myScrollView.delaysContentTouches = NO;
    myScrollView.scrollEnabled = true;
    myScrollView.userInteractionEnabled = YES;
    myScrollView.scrollsToTop = NO;


     mySettingsTableView = [[SettingsTableView alloc] init];

// Settings View Ctrl
    SettingsTableViewCtrl *mySettingsTableViewCtrl = [[SettingsTableViewCtrl alloc] initWithStyle:UITableViewStyleGrouped];
    mySettingsTableViewCtrl.tableView.scrollEnabled = NO;
mySettingsTableViewCtrl.tableView.delaysContentTouches = NO;
mySettingsTableViewCtrl.tableView.canCancelContentTouches = NO;
mySettingsTableViewCtrl.view.userInteractionEnabled = YES;

[mySettingsTableViewCtrl.view addSubview:myScrollView];
[mySettingsTableViewCtrl.view addSubview:mySettingsTableView];

* 在 scrollView 的子类中 *

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
    //if (![self yourMethodThatDeterminesInterestingTouches:touches withEvent:event])
    [super touchesBegan:touches withEvent:event];
    [self.nextResponder touchesBegan:touches withEvent:event];



这是来自触摸事件的 NSLog:

NSLog(@"Event: %@", event);
NSLog(@"Event NextResponder : %@\n", self.nextResponder);


2011-07-05 13:09:36.063 App[1924:14f03] Event: <UITouchesEvent: 0x802ea30> timestamp: 8503.71 touches: (
    <UITouch: 0x80e6f60> phase: Began tap count: 1 window: <UIWindow: 0x836eb00; frame = (0 0; 320 480); layer = <CALayer: 0x836ebb0>> view: <ScrollView: 0x83770b0; baseClass = UIScrollView; frame = (0 150; 320 680); clipsToBounds = YES; layer = <CALayer: 0x8376e00>; contentOffset: 0, 0> location in window: 140, 249 previous location in window: 140, 249 location in view: 140, 35 previous location in view: 140, 35
)

2011-07-05 13:09:36.065 App[1924:14f03] Event NextResponder : <SettingsTableViewCtrl: 0x8377db0>

【问题讨论】:

为什么要在tableview中添加scrollview? 我不是,我在表格视图的顶部添加了一个滚动视图。基本上我想在我的tableview顶部滚动一个datePicker,当完成datePicker后我想将它滚动回“关闭”tableview。但是,对于测试,我目前在滚动视图中什么都没有。 暂时检查不添加滚动视图到 SettingsTableViewCtrl。 是的,没有滚动视图,一切都可以正常工作,滚动视图是新增功能。谢谢 【参考方案1】:

我的代码也有同样的问题,我通过将 UITapGestureRecognizer 添加到我想要处理触摸的视图中解决了这个问题。 在您的情况下,您还应该将 UITapGestureRecognizer 添加到滚动视图(如果您想处理触摸)或表格视图(如果您想处理触摸);

UITapGestureRecognizer  *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tappedScrollView)];
[tapRecognizer setNumberOfTapsRequired:1];
[myScrollView addGestureRecognizer:tapRecognizer];
[tapRecognizer release];

你想在触摸上做的事情应该在一个方法中完成;

-(void)tappedScrollView //TO-DO 触摸滚动视图后你想做的事情,在这里做。

同样,您可以为您的表格视图执行此操作;

UITapGestureRecognizer  *tapRecognizerForTableView = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tappedTableView)];
[tapRecognizerForTableView setNumberOfTapsRequired:1];
[mySettingsTableView addGestureRecognizer:tapRecognizerForTableView];
[tapRecognizerForTableView release];

你想在触摸上做的事情应该在一个方法中完成;

-(void)tappedTableView //TO-DO 触摸 Table view 后你想做的事情,在这里做。

【讨论】:

谢谢 我稍后会测试,但你能解释一下为什么它不起作用吗?我从 NSLOG 中看到,nextResponder 实际上是 TableView,所以看起来它会将触摸事件传递到正确的位置。它只是没有得到它? 大家好,所以使用 UITapGestureRecognizer 是可行的(以某种方式),但它不能解释为什么滚动视图没有将事件传递给响应者链。有任何想法吗?我可以从 NSLOG 中看到,tableview 和 tableviewctrl 都会看到该事件,我尝试将 UITableViewCell 子类化,并且在涉及滚动视图时它看不到事件/触摸。当滚动视图不存在时,它确实会看到触摸。再次感谢,D【参考方案2】:

这是我最终的结果,虽然还不完美,但可以工作,任何调整建议都将不胜感激......

//AppDelegate.m

ScrollView *myScrollView = [[ScrollView alloc] initWithFrame:CGRectMake(0, 140, 320, 680)];
myScrollView.contentSize = CGSizeMake( 320 , 888);
myScrollView.pagingEnabled = NO;
myScrollView.bounces = NO;
myScrollView.directionalLockEnabled = YES;
myScrollView.canCancelContentTouches = NO;
myScrollView.delaysContentTouches = NO;
myScrollView.scrollEnabled = true;
myScrollView.userInteractionEnabled = YES;
myScrollView.scrollsToTop = NO;

mySettingsTableViewCtrl = [[SettingsTableViewCtrl alloc] initWithStyle:UITableViewStyleGrouped];
mySettingsTableViewCtrl.tableView.scrollEnabled = NO;
mySettingsTableViewCtrl.tableView.delaysContentTouches = NO;
mySettingsTableViewCtrl.tableView.canCancelContentTouches = NO;
mySettingsTableViewCtrl.view.userInteractionEnabled = YES;

[mySettingsTableViewCtrl.view addSubview:myScrollView];
[mySettingsTableViewCtrl.view addSubview:mySettingsTableView];

//ScrollView.m

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

//SettingsTableView.m

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

UITouch *touch = [touches anyObject];
NSUInteger tapCount = [touch tapCount];
CGPoint location = [touch locationInView:self];

NSIndexPath *indexPathAtHitPoint = [self indexPathForRowAtPoint:location];
if ( [self cellForRowAtIndexPath:indexPathAtHitPoint] ) 
    [self.delegate tableView:self didSelectRowAtIndexPath:indexPathAtHitPoint];      
 else 
    [super touchesBegan:touches withEvent:event];
 

现在我在滚动视图顶部有一个 DatePicker 及其工作,但此代码需要一些额外的代码来管理它,即检测何时“触摸”选择器以及何时不存在。但这应该不会太难(我认为;)

感谢帮助和cmets,

D

【讨论】:

【参考方案3】:

我认为将 ScrollView 用于您的目的可能是矫枉过正。您可以“滚动”任何视图。定位它使其部分或全部超出边界,在父视图上设置剪辑模式,当您想要“滚动”它时,将其帧更改为边界,动画生效。也就是说,如果您滚动 DatePicker 以响应其他事件(例如向与日期关联的表中添加项目)。如果用户通过拖动滚动日期选择器,则继续。

将滚动视图和表格视图结合起来会很棘手,因为表格视图是滚动视图。应该处理滚动手势是模棱两可的。这可能是可能的,但您可能必须编写额外的代码来明确歧义。

【讨论】:

我实际上得到了它的工作,如最初描述的那样。基本上我没有自动滚动它,我希望用户用他们的手指与之交互。我已经全力以赴。

以上是关于NavCtrl + TableViewCtrl + ScrollView,TableView 没有接触的主要内容,如果未能解决你的问题,请参考以下文章

无法读取未定义的属性“navCtrl”

如何使用包含类名的变量来使用 navCtrl.push()?

Ionic 4 - 如何使用navCtrl或Router服务在页面之间传递数据

如何在不使用离子的this.navCtrl.push(PostPage,data)的情况下将数据传递到另一个页面

JSPatch解析

ionic3中NavController类push setRoot相关问题解决