2012-04-08 47 views
2

好了,我都爲這個問題,但沒有一個現有的解決方案的研究似乎沒有解決我的問題,所以在這裏它是:問題時scrollViewDidScroll,但不UIScrollViewDelegate的所有其他方法

  • 我有一個擴展的UIScrollView(幷包含一個UIView)
  • 我想覆蓋從UIScrollViewDelegate的scrollViewDidScroll方法的自定義類(但不是所有的方法)

我已經嘗試實現從這個代碼問題:How to subclass UIScrollView and make the delegate property private但由於某種原因,它不會執行任何操作(被覆蓋的自定義方法永遠不會被調用)。我也知道,你沒有,如果你創建一個實現協議(根據iPhone: Do I need to implement all methods for UIScrollViewDelegate (or any delegate))自定義委託類來實現所有的UIScrollViewDelegate方法 - 但是當我這樣做:

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 

在其延伸UIScroll子類查看

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

但是,儘管編譯和運行,當我嘗試滾動滾動視圖,它與EXC_BAD_ACCESS和一個神祕的「(LLDB)」在調試控制檯消息崩潰。

所以我在這裏有點不知所措。

回答

2

我確實有一個How to subclass UIScrollView and make the delegate property private的實現。我的猜測是爲什麼你的代碼沒有做任何事情:仔細檢查你是否真的將滾動視圖的contentSize設置爲大於視圖尺寸的東西。如果它比較小,則不會滾動,只會彈起,並且不會調用scrollViewDidScroll

對於你的代碼,你實際上在一行中有兩個問題。首先,UIScrollView的委託屬性是assign類型的。這就是說,如果委託類沒有保留在其他地方,它會在一段時間內消失,你會得到EXC_BAD_ACCESS。其次,通過將[[MyScrollViewDelegate alloc] init]分配給委託,並且不釋放該對象,則創建一個引用計數爲1的孤立對象,並且永遠不會釋放該對象。我的猜測是,系統在運行時識別孤兒對象並清理它,然後在代理髮送消息時得到您的EXC_BAD_ACCESS

如果你喜歡使用有單獨的委託您的版本如下我會解決它:

@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 

不過,不要忘記將contentSize設置的東西比圖範圍大。否則將不會滾動,也不會有委託呼叫。

+0

非常感謝!讓我順便說一句試試這個...... – 2012-04-11 23:42:38

+0

,我沒設置contentSize至大於整體的UIScrollView對象的視圖邊界(至少垂直 - 水平,我認爲大小是一樣的)。 – 2012-04-11 23:47:17

+0

太棒了!這工作!就在兩個意見: – 2012-04-11 23:57:52

相關問題