ios5 - 重写scrollViewDidScroll时出现问题,但不是UIScrollViewDelegate的所有其他方法

标签 ios5 uiscrollview uiscrollviewdelegate

好吧,我对这个问题进行了所有研究,但现有的解决方案似乎都不能解决我的问题,所以这里是:

  • 我有一个扩展 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/

相关文章:

iphone - 嵌套的 UIScrollViews 同时滚动

ios - 创建一个 UIView 捕捉点击,但对所有其他手势透明

ios - UIScrollView 滚动时更改 contentInset

ios - scrollViewWillEndDragging :withVelocity:targetContentOffset: not working on the edges of a UISCrollView

ios - 使用 iphone sdk 在应用内购买货币交易

ios5 - 谷歌分析 2.0b3 ios 5 支持

javascript - 将数组从 objc 传递给 javascript 函数

iphone - 无法将 Facebook 集成到 iPhone 应用程序

ios - 我的 UIScrollView 辅助类中的泄漏