0

Ich schreibe eine iOS 5 App (in Xcode 4.3, mit Storyboards und ARC), die einige Tabellenzellen hat, die auf horizontale Schwenks reagieren müssen. Ich hatte eine Tischkonfiguration, die wirklich gut funktionierte, aber dann musste ich das gleiche Verhalten in einer anderen Szene implementieren. Ich dachte, der beste Weg bestünde darin, den Gestenerkennungs- und -handhabungscode in Unterklassen zu abstrahieren. Aber jetzt scrollt die TableView nicht, und die Lösung, die ich für dieses Problem unter der alten Methode hatte, hilft nicht.Warum scrollt meine UItableView-Unterklasse nicht?

Ich habe eine RestaurantViewController, die von UIViewController erbt und hat eine Eigenschaft ULPanningTableView *tableView. Einige der Zellen der Tabelle sind MenuItemCell s und erben von ULPanningTableViewCell. Delegat und Datenquelle der Tabelle sind die RestaurantViewController.

ULPanningTableViewCell erbt von UITableViewCell und ist ziemlich nah an dem Original, der einzige Unterschied ist, dass es Eigenschaften hat, um die Vorder- und Rückseite der Zelle und die benutzerdefinierten Hintergründe zu verfolgen.

ULPanningTableView ist ein bisschen komplizierter, da es die Erkennung und Handhabung einrichten muss.

ULPanningTableView.h:

#import <UIKit/UIKit.h> 

@interface ULPanningTableView : UITableView <UIGestureRecognizerDelegate> 

@property (nonatomic) float openCellLastTX; 
@property (nonatomic, strong) NSIndexPath *openCellIndexPath; 

- (id)dequeueReusablePanningCellWithIdentifier:(NSString *)identifier; 
- (void)handlePan:(UIPanGestureRecognizer *)panGestureRecognizer; 
// ... some helpers for handlePan: 

@end 

und ULPanningTableView.m:

#import "ULPanningTableView.h" 
#import "ULPanningTableViewCell.h" 

@implementation ULPanningTableView 

@synthesize openCellIndexPath=_openCellIndexPath, openCellLastTX=_openCellLastTX; 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     // Initialization code 
    } 
    return self; 
} 

#pragma mark - Table View Helpers 

- (id)dequeueReusablePanningCellWithIdentifier:(NSString *)identifier 
{ 
    ULPanningTableViewCell *cell = (ULPanningTableViewCell *)[self dequeueReusableCellWithIdentifier:identifier]; 

    UIPanGestureRecognizer *panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)]; 
    [panGestureRecognizer setDelegate:self]; 
    [cell addGestureRecognizer:panGestureRecognizer]; 

    return cell; 
} 

#pragma mark - UIGestureRecognizerDelegate protocol 

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer 
{ 
    // for testing: only allow UIScrollViewPanGestureRecognizers to begin 
    NSString *gr = NSStringFromClass([gestureRecognizer class]); 
    if ([gr isEqualToString:@"UIScrollViewPanGestureRecognizer"]) { 
     return YES; 
    } else { 
     return NO; 
    } 
} 

#pragma mark - panhandling 

- (void)handlePan:(UIPanGestureRecognizer *)panGestureRecognizer 
{ 
    // ... 
} 
// ... some helpers for handlePan: 

@end 

ich um mit gestureRecognizerShouldBegin: gespielt haben, denn das war, wie ich dieses Problem wieder gelöst, wenn diese nicht getrennte Klassen waren (ULPanningTableView Sachen wurde in RestaurantViewController und ULPanningTableViewCell implementiert wurde Zeug in MenuItemCell implementiert wurde.Ich würde im Wesentlichen zurück Nein für Gesten, wo t er translationInView war mehr vertikal als horizontal). Jedenfalls kann ich den Tisch nicht zum Scrollen bringen! Ich kann die Schwenkbewegungen erkennen, wenn ich JA von gestureRecognizerShouldBegin: zurückgebe, oder wenn ich die UIGestureRecognizerDelegate Implementierung vollständig entferne.

Ich bin immer noch ein Anfänger in iOS, und in Objective-C, so habe ich nur Vermutungen basierend auf Dinge, die ich gelesen habe, und ich habe den Eindruck, von einem similar problem, dass der Täter ist UIScrollViewPanGestureRecognizer tun Voodoo mit die Antwortsenderkette ...

Ich würde sehr schätzen jedes mögliches Licht, das Sie auf dieses abwerfen können!

+0

Versuchen Sie, einen Blick in die Zelle zu bewegen, oder versuchen Sie, den Inhalt der Zelle, horizontal zu scrollen? – NJones

+0

Horizontale Schwenkung sollte eine Ansicht in der Zelle verschieben. Ich konnte nicht herausfinden, wie ich mit dem Inhalt der Zelle interagieren sollte, um ihre 'backgroundView' zu zeigen, also bewege ich eine benutzerdefinierte Eigenschaft der Zelle' UIView * frontView'. Die vertikale Schwenkung sollte durch die Tabelle rollen. –

Antwort

0

Ok, also fühle ich mich wirklich albern. -handlePan: ist schon eine Methode! Ich änderte es zu -handleCustomPan: und es wird normalerweise andere Pfannen behandeln. Ich bin mir nicht sicher, warum es nicht zusammenbrach, aber da ist es. Oh, und ich hatte die UIScrollViewPanGestureRecognizer Rand Fall in -gestureRecognizerDidBegin: zu halten:

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer 
{ 
    NSString *gr = NSStringFromClass([gestureRecognizer class]); 
    if ([gr isEqualToString:@"UIScrollViewPanGestureRecognizer"]) { 
     // allow scroll to begin 
     return YES; 
    } else if ([gr isEqualToString:@"UIPanGestureRecognizer"]){ 
     UIPanGestureRecognizer *panGR = (UIPanGestureRecognizer *)gestureRecognizer; 
     // allow horizontal pans to begin 
     ULPanningTableViewCell *cell = (ULPanningTableViewCell *)[panGR view]; 
     CGPoint translation = [panGR translationInView:[cell superview]]; 
     BOOL should = (fabs(translation.x)/fabs(translation.y) > 1) ? YES : NO; 

     if (!should) { 
      [self closeOpenCellAnimated:YES]; 
     } 

     return should; 

    } else { 
     NSLog(@"%@",gestureRecognizer); 
     return NO; 
    } 
}