UITouch事件和表视图

时间:2010-05-14 03:20:27

标签: iphone cocoa-touch uitouch

我正在开发一个基于导航的仅限iPhone的应用程序,它有两个主要用途:一个用于在分层视图中显示数据,允许用户向下钻取并最终编辑所述数据,以及两个用于所有用户在点击表格视图单元格时执行默认操作。我现在需要提供与相同数据相关的一小组选项;但是,显然都采用了didSelectRowAtIndexPath:和accessoryButtonTappedForRowAtIndexPath:方法。

所以,我的选择似乎是实现一个双击方法,其中一小部分附加选项将在(你猜对了)双击所述表格行之后呈现;或者,优选地,采用保持和保持方法。从我所知道的情况来看,点击并保持似乎是SDK 4.0中的方式 - 这对我这个炽热的一分钟没有好处。我决定选择双击选项,但我遇到了一些麻烦。

首先,touchesBegan:withEvent:方法似乎根本没有被调用;在应用程序运行时,永远不会调用放置在方法中的断点,并且表视图的响应与插入方法之前完全相同(也就是说,它执行默认操作):

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *aTouch = [touches anyObject];
    if (aTouch.tapCount == 2) {
        [NSObject cancelPreviousPerformRequestsWithTarget:self];
    }
}

其次,我真的不需要处理单击 - didSelectRowAtIndexPath:方法可以处理单击即可。双击是我想要处理的时髦。我怀疑答案将包含短语“你不能让表格视图处理单击,touchesBegan:方法处理双击。触摸处理方法必须处理所有这些。”

我真的很感谢一些处理过这个问题的人的指导。提前谢谢。

1 个答案:

答案 0 :(得分:2)

好吧,经过一个星期的搔痒和在我的呼吸下喃喃自语,我终于得出以下结论:虽然理论上可以使用当前版本的iPhone OS做我想做的事情。它的工作规模将变得非常艰巨。看看iPhone OS 4将在不久的将来如何发布,我选择使用4.0 SDK功能来实现我正在寻找的行为。

具体来说,我所做的是:

// in my tableView:cellForRowAtIndexPath: method
static NSString *CellIdentifier = @"CustomCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
[[NSBundle mainBundle] loadNibNamed:@"TableViewCell" owner:self options:nil];
    cell = tvCell;
    self.tvCell = nil;
}
UILabel *label;
label = (UILabel*)[cell viewWithTag:1];
label.text = [NSString stringWithFormat:@"Main Label"];
label = (UILabel*)[cell viewWithTag:2];
label.text = [NSString stringWithFormat:@"Sub Label"];
UILongPressGestureRecognizer *recognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPress:)];
[[cell viewWithTag:0] addGestureRecognizer:recognizer];
[recognizer release];
UIImage *theImage = [UIImage imageNamed:@"silhouette.png"];
UIImageView *pictureView = (UIImageView*)[cell viewWithTag:0];
pictureView.image = theImage;
return cell;

我为自定义单元格创建了一个单独的NIB文件;它只是一个tableViewCell对象,最左边有一个imageView(用于联系人的照片),中间有两个标签(主标签有较大的文本,副标签有较小的文本)。 cellForRowAtIndexPath:方法根据需要加载此自定义单元格,然后使用一些静态数据填充单元格(当我将此代码合并到现有应用程序中时,这显然会更改)。我只需要为手势识别器实现一种新方法:

- (void)handleLongPress:(UILongPressGestureRecognizer*)sender {
NSLog(@"Long press detected.");
}

显然,当我实际使用它时,它也会充实。

整个交易就像一个魅力。点击并按住单元格会触发“长按检测到”日志,并且常规单击会在tableView:didSelectRowAtIndexPath:方法中触发类似的“短按检测到”日志。

希望这有助于某人。