2010-05-14 38 views
0

我正在研究一个基于导航的iPhone应用程序,该应用程序有两个主要用途:一,以分层视图呈现数据,允许用户深入并最终编辑所述数据,二,在所有用户点击表格视图单元格时执行默认操作。我现在需要提供一组与相同数据绑定的选项;然而,显然采用了didSelectRowAtIndexPath:和accessoryButtonTappedForRowAtIndexPath:方法。UITouch事件和表格视图

所以,我的选择似乎是实现一个双抽头方法,其中附加选项的小列表将出现在(你猜对了)在所述表格行上的双击;或者优选地是轻敲和保持方法。从我所知道的来看,点击并保持似乎是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:方法处理双击,触摸处理方法必须处理所有这些。”

我真的很感谢你们中的一些人处理过这个问题。提前致谢。

回答

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:方法中类似的“短按检测到”日志。

希望这有助于某人。