好吧,我对这个问题进行了所有研究,但现有的解决方案似乎都不能解决我的问题,所以这里是:
- 我有一个扩展 UIScrollView (并包含 UIView)的自定义类
- 我想重写 UIScrollViewDelegate 中的scrollViewDidScroll 方法(但不是所有方法)
我已经尝试实现此问题中的代码:How to subclass UIScrollView and make the delegate property private但由于某种原因,它不执行任何操作(被重写的自定义方法永远不会被调用)。我还知道,如果您创建一个实现该协议(protocol)的自定义委托(delegate)类(按照 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
在扩展UIScrollView的子类中
// this scrollview is initiated by the NIB
- (void)awakeFromNib
{
...
[self setDelegate:[[MyScrollViewDelegate alloc] init]];
}
但是当它编译并运行时,当我尝试滚动可 ScrollView 时,它崩溃并出现 EXC_BAD_ACCESS 并在调试控制台中显示神秘的“(lldb)”消息。
所以我有点不知所措。
最佳答案
我确实有 How to subclass UIScrollView and make the delegate property private 的实现这样可行。我猜为什么你的代码没有做任何事情:仔细检查你是否确实将 ScrollView 的 contentSize 设置为大于 View 大小的值。如果它较小,则不会滚动,只会弹跳,并且不会调用 scrollViewDidScroll
。
对于您的代码,实际上在一行中有两个问题。首先,UIScrollView的delegate属性是assign类型。也就是说,如果委托(delegate)类没有在其他地方保留,它将在一段时间后消失,并且您将获得EXC_BAD_ACCESS
。其次,通过将 [[MyScrollViewDelegate alloc] init]
分配给委托(delegate)而不释放该对象,您将创建一个引用计数为 1 并且永远不会被释放的孤立对象。我的猜测是,系统在运行时识别出孤立对象并清理它,之后当向委托(delegate)发送消息时,您将获得 EXC_BAD_ACCESS
。
如果您更喜欢将您的版本与单独的委托(delegate)一起使用,我将按如下方式修复它:
@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 设置为大于 View 边界的值。否则将不会有滚动,也不会有委托(delegate)调用。
关于ios5 - 重写scrollViewDidScroll时出现问题,但不是UIScrollViewDelegate的所有其他方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10063894/