2013-10-02 59 views
1

目前,我想要寫的iPhone音樂播放器應用程序錯誤的細胞執行。部分設計是可以在單個歌曲列表中滑動以顯示其他選項(如在iOS 7 Mail.app中)。的UITableView didSelectRow上即使touchesCancelled稱爲定製的UITableViewCell包含自定義的UIScrollView

我在一個自定義的UITableViewCell的幫助下實現了這個功能,UITableViewCell包含一個自定義的UIScrollView和兩個UIViews(一個用於實際內容,另一個用於「背景菜單」),其工作方式與預期相當。隨着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]; 
} 

現在我的問題如下: 當我按住列表中的單元格並開始滾動時,mediaplayer不會開始播放(如預期的那樣)。但是,當我點擊列表中的任何其他條目時,並不是我點擊的標題被播放,而是我第一次按住然後開始滾動。這隻會發生,如果我不滾動和點擊並按住(在滾動期間提出了「滾動期間的意想不到的觸摸階段」,我猜這是什麼最終取消輕敲和停止滾動-保持)。

有什麼辦法來糾正這種行爲(一切工作正常,如果我只是用普通的UITableViewCell所以我想休息的UIScrollView一切)?

回答

1

我有完全一樣的問題,因爲你。

我沒有什麼修復它是設置包含的tableview作爲小區的委託視圖控制器。

然後我在我的小區中設置的代表選擇器輕敲姿勢傳遞給包含我的tableview視圖控制器。

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

的委託是包含在其中所述細胞是的tableview視圖控制器。

現在在小區中的所有水龍頭手勢被獲取,並在視圖控制器我實現:

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

我這是怎麼固定的這個問題。

+0

感謝您的詳細回覆。同時,我切換到UIPanGestureRecognizer以「手動」滾動我的視圖。目前,我會堅持使用這個解決方案,但是現在再次使用scrollView似乎是可能的,我可能會再次嘗試。 – dorbeetle

相關問題