2012-04-08 5 views
2

Okay, so habe ich die ganze Forschung für dieses Problem, aber keiner der bestehenden Lösungen scheinen mein Problem zu lösen, so ist es hier:Probleme beim Überschreiben scrollViewDidScroll, aber nicht alle anderen Methoden der UIScrollViewDelegate

  • ich habe eine benutzerdefinierte Klasse, die UIScrollView (und enthält eine UIView)
  • ich die scrollViewDidScroll Methode von UIScrollViewDelegate außer Kraft setzen möchte, dass sie (aber nicht alle Methoden)

ich bereits versucht habe, den Code von dieser Umsetzung Ausgabe: How to subclass UIScrollView and make the delegate property private aber aus irgendeinem Grund tut es nichts (die benutzerdefinierte Methode, die überschrieben wurde, wird nie aufgerufen). Ich weiß auch, dass man nicht alle Methoden von UIScrollViewDelegate implementieren müssen, wenn Sie einen benutzerdefinierten Delegaten Klasse erstellen, die das Protokoll (per iPhone: Do I need to implement all methods for UIScrollViewDelegate (or any delegate)) implementiert - aber wenn ich dies tun:

MyScrollViewDelegate.h

@interface MyScrollViewDelegate: NSObject <UIScrollViewDelegate> 

-(void)scrollViewDidScroll:(UIScrollView *)scrollView; 

@end 

MyScrollViewDelegate.m

@implementation MyScrollViewDelegate 

-(void)scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
    NSLog(@"Custom scrollViewDidScroll called."); 
    // -- some more custom code here -- 
    // ... 
} 

@end 

in der Unterklasse, die UIScroll erstreckt Ansicht

// this scrollview is initiated by the NIB 
- (void)awakeFromNib 
{ 
    ... 
    [self setDelegate:[[MyScrollViewDelegate alloc] init]]; 
} 

Aber während es kompiliert und ausgeführt, wenn ich versuche, die scrollbaren Ansicht zu scrollen, stürzt mit EXC_BAD_ACCESS und einer kryptischen „(LLDB)“ Meldung in der Debug-Konsole.

So bin ich hier etwas ratlos was zu tun ist.

Antwort

2

Ich habe eine Implementierung von How to subclass UIScrollView and make the delegate property private, die funktioniert. Ich schätze, warum Ihr Code nichts getan hat: Überprüfen Sie, ob Sie die contentSize der Bildansicht tatsächlich auf etwas Größeres als die Größe Ihrer Ansicht eingestellt haben. Wenn es kleiner ist, dann gibt es kein Scrollen, nur Springen, und die scrollViewDidScroll wird nicht aufgerufen.

Für Sie Code haben Sie tatsächlich zwei Probleme in einer Zeile. Zunächst ist die Delegate-Eigenschaft von UIScrollView vom Typ assign. Das heißt, wenn die Delegiertenklasse nicht an anderer Stelle beibehalten wird, verschwindet sie in einiger Zeit und Sie erhalten EXC_BAD_ACCESS. Zweitens, indem Sie dem Delegaten zuweisen und das Objekt nicht freigeben, erstellen Sie ein verwaistes Objekt, dessen Verweisanzahl 1 ist und die niemals freigegeben wird. Meine Vermutung ist, dass das System das verwaiste Objekt in der Laufzeit erkennt und es bereinigt, danach erhalten Sie Ihre EXC_BAD_ACCESS, wenn der Delegat eine Nachricht gesendet wird.

Wenn Sie Ihre Version mit separatem Delegierten verwenden würde ich es beheben, wie folgt:

@interface MyScrollView: UIScrollView 
{ 
    id<NSObject, MyScrollViewDelegate> dlgt; 
    ... 
} 
... 
@end 

@implementation MyScrollView 
- (void)awakeFromNib 
{ 
    ... 
    dlgt = [[MyScrollViewDelegate alloc] init]; 
    [self setDelegate:dlgt]; 
} 

-dealloc 
{ 
    [dlgt release]; 
    [super dealloc]; 
} 
@end 

Noch nicht vergessen die Content etwas größer als die Ansicht Grenzen zu setzen. Sonst wird es keine Scrolling- und keine Delegate-Aufrufe geben.

+0

Vielen Dank! Lassen Sie mich das ausprobieren ... –

+0

BTW, ich habe contentSize auf einen größeren Wert gesetzt als die Ansichtsgrenzen des gesamten UIScrollView-Objekts (zumindest vertikal - horizontal denke ich, dass die Größe gleich ist). –

+0

Super! Das funktioniert! Nur zwei Kommentare: –