gpt4 book ai didi

ios - UITableView didSelectRow 在错误的 Cell 上执行,即使 touchesCancelled 调用了包含自定义 UIScrollView 的自定义 UITableViewCell

转载 作者:行者123 更新时间:2023-11-29 13:03:48 26 4
gpt4 key购买 nike

我目前正在尝试为 iPhone 编写音乐播放器应用程序。设计的一部分是可以在歌曲列表的单个条目上滑动以显示其他选项(例如在 iOS 7 Mail.app 中)。

我在自定义 UITableViewCell 的帮助下实现了这一点,它包含一个自定义 UIScrollView 和两个 UIView(一个用于实际内容,一个用于“背景菜单”),它的工作大部分符合预期。由于 UIScrollView 似乎接受了 TableViewCells 上的所有触摸,这禁用了实际播放歌曲的选项,因此我转发了触摸事件(例如提议的 here):

CellScrollView.m

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
if (![self isDragging]){
[[self superview] touchesBegan:touches withEvent:event];
}
[super touchesBegan: touches withEvent: event];
}

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
if (![self isDragging]){
[[self superview] touchesMoved:touches withEvent:event];
}
[super touchesMoved: touches withEvent: event];
}

-(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event{
if (![self isDragging]){
[[self superview] touchesCancelled:touches withEvent:event];
}
[super touchesCancelled: touches withEvent: event];
}

- (void) touchesEnded: (NSSet *) touches withEvent: (UIEvent *) event{
if (![self isDragging]){
[[self superview] touchesEnded:touches withEvent:event];
}
[super touchesEnded: touches withEvent: event];
}

现在我的问题是:当我按住列表中的一个单元格并开始滚动时,媒体播放器不会开始播放(如预期的那样)。但是,当我随后点击列表的任何其他条目时,播放的不是我点击的标题,而是我首先按住然后开始滚动的标题。只有当我不再滚动并在点击并按住后通过点击停止滚动时才会发生这种情况(这会在日志中显示“滚动期间意外的触摸阶段”,我想这就是最终取消点击的原因 - 并且-保持)。

有什么方法可以纠正这种行为(如果我只使用普通的 UITableViewCell 一切正常,所以我猜 UIScrollView 会破坏一切)?

最佳答案

我遇到了和你一样的问题。

我所做的修复是将包含 tableview 的 View Controller 设置为单元格的委托(delegate)。

然后我在我的单元格上设置了一个委托(delegate)选择器,以将点击手势传递给包含我的 tableview 的 View Controller 。

@class GameSequenceCell;

@protocol CustomCellDelegate <NSObject>
- (void)didSelectCell:(CustomCell *)sender;
@end

@interface CustomCell : UITableViewCell
/*
* Some stuffs
*/
@end

然后我直接在单元格上添加了一个 UITapGestureRecognizer。这必须在单元初始化时完成。

- (id)initWithReuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuseIdentifier];
if (self) [self prepareForFirstUse];
return self;
}

-(id)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self) [self prepareForFirstUse];
return self;
}

-(void)prepareForFirstUse
{
/*
* The tap gesture recognizer is needed to be able to tap on the scroll view in the cell
* Calling the singleTapGestureCaptured will trigger the tableView:didSelectRowAtIndexPath:
* of the EventPanelVC tableview delegate.
*/
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapGestureCaptured:)];
[self addGestureRecognizer:singleTap];
}

然后我在单元格中实现了:

- (void)singleTapGestureCaptured:(UITapGestureRecognizer *)gesture
{
[self.delegate didSelectCell:self];
}

委托(delegate)是包含单元格所在的 TableView 的 View Controller 。

现在单元格中的所有轻击手势都被捕获并在我实现的 View Controller 中:

- (void)didSelectCell:(CustomCell *)sender;
{
NSIndexPath *indexPathOfTouchedCell = [self.fetchedResultsController indexPathForObject:sender.object];
if(indexPathOfTouchedCell)
{
[self.tableView selectRowAtIndexPath:indexPathOfTouchedCell animated:YES scrollPosition:UITableViewScrollPositionNone];
[self tableView:self.tableView didSelectRowAtIndexPath:indexPathOfTouchedCell];
}
}

这就是我解决这个问题的方法。

关于ios - UITableView didSelectRow 在错误的 Cell 上执行,即使 touchesCancelled 调用了包含自定义 UIScrollView 的自定义 UITableViewCell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19135824/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com