NavCtrl + TableViewCtrl + ScrollView,TableView没有得到触动

时间:2011-07-05 05:25:15

标签: iphone ios uitableview uiscrollview

我有一个NavCtrl,最重要的是我有一个TableView / ctrl,然后我有一个scrollview。

我已经完成了所有工作,但我似乎无法触及桌面视图中的Cell。

我已经尝试了下一个响应者的事情,一切似乎都在做正确的事情。这里有一些代码片段,请记住这段代码已经过很多改动以便进行测试,所以它还不是“干净”:):


    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>

3 个答案:

答案 0 :(得分:0)

我的代码存在同样的问题,并通过将 UITapGestureRecognizer 添加到我想要处理触摸的视图来解决它。 在您的情况下,如果您想要处理它上的触摸,或者如果您想要处理它上的触摸,您还应该将UITapGestureRecognizer添加到滚动视图;

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

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

- (无效)tappedScrollView {
//在Scroll视图触摸后,TO-DO你想要的东西,在这里做。 }

同样,您可以将您的表视图用作;

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

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

- (无效)tappedTableView {     //在表格视图触摸后,你想做什么,在这里做。 }

答案 1 :(得分:0)

这就是我最终的结果,不是完美而是工作,任何调整建议都会非常感激......

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

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

感谢您的帮助和评论,

d

答案 2 :(得分:0)

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

组合滚动视图和表视图将非常棘手,因为表视图是滚动视图。应该处理滚动手势的模糊不清。它可能是可能的,但您可能必须编写额外的代码以使歧义明确。