0

我正在开发一个基于导航的仅限 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:方法处理双击。触摸处理方法必须处理所有这些。”

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

4

1 回答 1

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

希望这可以帮助某人。

于 2010-05-21T21:03:01.353 回答