2012-04-08 35 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

相关问题