2009-07-08 11 views
4

Ich habe eine UITextView, dass ich einen einzigen Tipp für erkennen möchte.UITextView Touch-Ereignisse nicht feuern

Es sieht so aus, als wäre ich in Ordnung mit einfach überschreiben touchesEnded:withEvent und Überprüfung [[touches anyObject] tapCount] == 1, jedoch dieses Ereignis nicht einmal feuern.

Wenn ich die 4 Veranstaltungen wie diese außer Kraft setzen:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch *touch = [touches anyObject]; 
    NSLog(@"touchesBegan (tapCount:%d)", touch.tapCount); 
    [super touchesBegan:touches withEvent:event]; 
} 

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 
     NSLog(@"touches moved"); 
} 

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch *touch = [touches anyObject]; 
    NSLog(@"touchesEnded (tapCount:%d)", touch.tapCount); 
     [super touchesEnded:touches withEvent:event]; 
} 

-(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event { 
     NSLog(@"touches cancelled"); 
} 

ich folgende Ausgabe:

> touchesBegan (tapCount:1) 
> touchesCancelled 
> touchesBegan (tapCount:1) 
> touches moved 
> touches moved 
> touches moved 
> touchesCancelled 

Es scheint, ich bekomme das nie touchesEnded Ereignis.

Irgendwelche Ideen?

+0

Was passiert, wenn Sie Ihre Anrufe auf Super nehmen? –

+0

Ich habe etwas ähnliches mit einer UITextView-Unterklasse getan, um Einzel- und Doppel-Taps zu erkennen - es funktioniert perfekt auf 2.x-Geräten, aber nicht auf 3.0. –

+0

@Reed Ich erwarte, dass Ihre Textansicht dann nicht scrollt. –

Antwort

1

Update: Ich landete hier die Technik mit bis: https://devforums.apple.com/message/94569#94569

Ich bin nicht sicher, ob dies ein Fehler ist oder nicht, aber die UITextView braucht die Berührungsereignisse zu nutzen, um das Popup-Menü für die Kopie zu tun & einfügen für 3.0, so könnte das erklären, warum es dieses Ereignis verschluckt.

Ziemlich lahm, wenn Sie mich fragen.

Update: Ich gebloggt diese hier: http://benscheirman.com/2009/07/detecting-a-tap-on-a-uitextview

+0

Ihr Blog-Link wurde geändert: http://benscheiman.com/ 2009/07/detecting-a-tap-on-a-uitextview – Raptor

0

Sie können Ausschneiden/Kopieren/Einfügen deaktivieren, indem Sie die canPerformAction:withSender: Methode überschreiben, so dass Sie einfach NEIN für alle Aktionen zurückgeben können, die Sie nicht zulassen möchten.

Siehe UIResponder documentation ...

Hoffentlich Ihre Berührungen aus dem Verzehr zu stoppen.

+0

Ich habe versucht, diese Methode zu überschreiben und stürzte ab. Ich gab NO für @selector (select :) und @selector (selectAll :) zurück, erlaubte aber trotzdem die Auswahl. –

+0

Ok, repariere die Abstürze (ich hatte vergessen den Rest auf Super überzuleiten) trotzdem scheint es keinen Effekt zu haben. Ich kann immer noch Text kopieren. –

+0

Die Dokumentation sagt, dass diese Methode auch weiter oben in der Responder-Kette aufgerufen wird, also ist es möglich, dass Sie sie auch in den enthaltenen Ansichten überschreiben müssen ... –

1

I subclassed UITextView wie so, die 5.0.1, auch mit IOS zu funktionieren scheint. Der Schlüssel ist, touchesBegan auch zu überschreiben, nicht nur berührtEnded (das ist, was ich wirklich interessiert).

@implementation MyTextView 


- (id)initWithFrame:(CGRect)frame { 
    return [super initWithFrame:frame]; 
} 

- (void) touchesBegan: (NSSet *) touches withEvent: (UIEvent *) event { 
    // If not dragging, send event to next responder 
    if (!self.dragging) 
     [self.nextResponder touchesBegan: touches withEvent:event]; 
    else 
     [super touchesBegan: touches withEvent: event]; 
} 

- (void) touchesEnded: (NSSet *) touches withEvent: (UIEvent *) event { 
    // If not dragging, send event to next responder 
    if (!self.dragging) 
     [self.nextResponder touchesEnded: touches withEvent:event]; 
    else 
     [super touchesEnded: touches withEvent: event]; 
} 

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender { 
    if (action == @selector(paste:)) 
     return NO; 
    if (action == @selector(copy:)) 
     return NO; 
    if (action == @selector(cut:)) 
     return NO; 
    if (action == @selector(select:)) 
     return NO; 
    if (action == @selector(selectAll:)) 
     return NO; 
    return [super canPerformAction:action withSender:sender]; 
} 

- (BOOL)canBecomeFirstResponder { 
    return NO; 
} 

- (void)dealloc { 
    [super dealloc]; 
}