2013-05-18 80 views
0

我有UITableView上的UITapGestureRecognizer。在我稱之爲scrollToRowAtIndexPath:atScrollPosition:animated:的方法之前,它很好用。一旦被調用,它就不起作用。一旦我打電話給setContentOffset:,它也不起作用。我必須用手指滾動tableView,然後點擊手勢才能工作。如何在設置contentOffset或滾動到一行之後讓它工作?點擊手勢不工作setContentOffset後

-(void)viewDidLoad { 
    // The gesture that doesn't work after 'setContentOffset:' 
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget: self action: @selector(hideShowEditing:)]; 
    [tap setCancelsTouchesInView: YES]; 
    [tap setDelegate: self]; 

    [self setEditTap: tap]; 
    [[self tableView] addGestureRecognizer: tap]; 
} 


-(BOOL)hideShowEditing:(UIGestureRecognizer *)gesture 
{ 
    CGPoint location = [gesture locationInView: [self tableView]]; 
    NSIndexPath *ip = [[self tableView] indexPathForRowAtPoint: location]; 
    TaskCell *cell = (TaskCell *)[[self tableView] cellForRowAtIndexPath: ip]; 

    // No cells are expanded, so expand this one 
    if (editingCellRow == -1 && editingCellSection == -1 && ![gesture isKindOfClass: [UISwipeGestureRecognizer class]]) { 

     editingCellRow = [ip row];       // if it's a swipe gesture, then it's from the crossOut method 
     editingCellSection = [ip section]; 

     [[self tableView] beginUpdates]; 
     [[self tableView] endUpdates]; 

     [cell addViewsForEditing]; 

     // Tap gesture only doesn't work if it has to scroll the tableView 
     [[self tableView] scrollToRowAtIndexPath: ip atScrollPosition: UITableViewScrollPositionNone animated: YES]; 

     return YES; 
    } 
    // Another cell is expanded, so unexpand the other cell 
    // and expand this cell 
    else if ((editingCellRow != [ip row] || editingCellSection != [ip section]) && ![gesture isKindOfClass: [UISwipeGestureRecognizer class]]) { 

     // Index path of the expanded cell 
     NSIndexPath *expandedIp = [NSIndexPath indexPathForRow: editingCellRow inSection: editingCellSection]; 
     TaskCell *expandedCell = (TaskCell *)[[self tableView] cellForRowAtIndexPath: expandedIp]; 

     [expandedCell setAnimateExpansion: YES]; 
     [cell setAnimateExpansion: YES]; 

     // Store the index of the new expanded cell 
     editingCellRow = [ip row]; 
     editingCellSection = [ip section]; 

     [[self tableView] beginUpdates]; 
     [[self tableView] endUpdates]; 

     [expandedCell removeViewsForEditing]; 

     [[self tableView] scrollToRowAtIndexPath: ip atScrollPosition: UITableViewScrollPositionNone animated: YES]; 

     [cell addViewsForEditing]; 

     return YES; 
    } 
    // Tapped the expanded cell, so unexpand it 
    else if (editingCellRow == [ip row] && editingCellSection == [ip section]) { 
     [cell setAnimateExpansion: YES]; 

     editingCellRow = -1; 
     editingCellSection = -1; 

     [[self tableView] beginUpdates]; 
     [[self tableView] endUpdates]; 

     [cell removeViewsForEditing]; 

     return YES; 
    } 

    return NO; 
} 

回答

0

我不明白爲什麼它不適合你。我已經測試過,它的工作原理。 我的tableViewController是我的委託的window.rootViewController的rootViewController這裏沒什麼特別的,這個想法是有一個導航欄來放置一個按鈕。

這是我tableViewController.h:

#import <UIKit/UIKit.h> 

@interface ViewController : UITableViewController <UIGestureRecognizerDelegate> 

// scrolling method 
- (void)move:(id)sender; 

// method triggered by the tap 
- (void)tapIt:(id)sender; 

@end 

這是我tableViewController.m(主要部分的摘錄):

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    // Add a bar button to call the scrolling method 
    UIBarButtonItem *rightBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:self action:@selector(move:)]; 
    self.navigationItem.rightBarButtonItem = rightBtn; 

    //add tap gesture 
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapIt:)]; 
    [tap setCancelsTouchesInView:YES]; 
    [tap setDelegate:self]; 
    tap.numberOfTouchesRequired = 1; 
    tap.numberOfTapsRequired = 1; 
    [[self tableView] addGestureRecognizer:tap]; 
} 

#pragma mark - Table view data source 
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    // Return the number of sections. 
    return 1; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    // Return the number of rows in the section. 
    return 20; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
    } 

    // Configure the cell... 
    cell.textLabel.text = [NSString stringWithFormat:@"item %i", indexPath.row]; 

    return cell; 
} 

// the scrolling method 
- (void)move:(id)sender 
{ 
    NSLog(@"scroll"); 
    //scroll to 17th row for exemple 
    [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:17 inSection:0] atScrollPosition:UITableViewScrollPositionBottom animated:YES]; 
} 

// method triggered by the tap gesture 
- (void)tapIt:(id)sender 
{ 
    NSLog(@"tap it"); 
} 
+0

我真的不知道爲什麼它不工作的權利。我的代碼看起來和你的一樣。我要嘗試使用按鈕而不是輕按手勢。 – bbraunj

+0

正如您所做的那樣,我嘗試在方法中配置輕擊手勢(editTap)。它也可以工作。你可以給我們hideShowEditing:方法嗎? – Franck

+0

我爲你添加了方法 – bbraunj