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.push()?
Ionic 4 - 如何使用navCtrl或Router服务在页面之间传递数据