UIScrollViewDelegate 没有触发

Posted

技术标签:

【中文标题】UIScrollViewDelegate 没有触发【英文标题】:UIScrollViewDelegate not firing 【发布时间】:2011-07-27 10:03:00 【问题描述】:

这可能是一些sort of duplicate of this question。但我试图应用它的答案无济于事。

我有一个UIScrollViewpagingEnabled。我想使用UIScrollViewDelegate 来帮助检测我在哪个页面上。这是我的代码:

@interface SearchMissionViewController : UIViewController <UIScrollViewDelegate> 

    UIScrollView *scroll;


    @property (nonatomic, retain) UIScrollView *scroll;

    - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView;
    - (void)scrollViewDidScroll:(UIScrollView *)scrollView;
    - (IBAction) popView;


    @end




- (void)viewDidLoad

    [super viewDidLoad] ;

    // Here I have also tried scroll.delegate = self;
    self.scroll.delegate = self;


    self.view.backgroundColor = [UIColor redColor];
    scroll = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];

    // Is this correct? I've added it to try to get the UIScrollView Delegate calling scrollViewDidEndScrollingAnimation (or whatever)
    // [scroll setContentOffset:CGPointMake(0.0, 0.0) animated:YES];


    scroll.pagingEnabled = YES;
    NSInteger numberOfViews = 3;
    for (int i = 0; i < numberOfViews; i++) 
        CGFloat yOrigin = i * self.view.frame.size.width;
        UIView *awesomeView = [[UIView alloc] initWithFrame:CGRectMake(yOrigin, 0, self.view.frame.size.width, self.view.frame.size.height)];
        awesomeView.backgroundColor = [UIColor colorWithRed:0.9 green:0.9 blue:0.9 alpha:1];


        UIImageView *targetView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"targetImageA.png"]];
        targetView.frame = CGRectMake(0.0, 0.0, 139, 153);
        targetView.frame = CGRectMake(yOrigin+90 , 80, 139, 153);


        UILabel *targetNameLabel = [[UILabel alloc] initWithFrame:CGRectMake(yOrigin+95, 230, 100, 20)];
        targetNameLabel.text = @"Bond";
        targetNameLabel.backgroundColor = [UIColor clearColor];
        targetNameLabel.textColor = [UIColor redColor];


        UILabel *missionNameLabel = [[UILabel alloc] initWithFrame:CGRectMake(yOrigin+95, 250, 100, 20)];
        missionNameLabel.text = @"Mission";
        missionNameLabel.backgroundColor = [UIColor clearColor];
        missionNameLabel.textColor = [UIColor redColor];



        [scroll addSubview:awesomeView];        
        [scroll addSubview:targetView];
        [scroll addSubview:targetNameLabel]; 
        [scroll addSubview:missionNameLabel];

        // Why does this get released? Wouldn't it then dissappear from the scroll view? Should I not be releasing other objects from above?
        [awesomeView release];


    
    scroll.contentSize = CGSizeMake(self.view.frame.size.width * numberOfViews, self.view.frame.size.height);
    [self.view addSubview:scroll];
    [scroll release]; 




    // Overlap image
    UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 460)];
    imgView.image= [UIImage imageNamed:@"mission-viewfinder.png"];
    [self.view addSubview:imgView];


    // Place back button ontop of the image. 
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom ];
    [button addTarget:self 
               action:@selector(popView)
    forControlEvents:UIControlEventTouchDown];
    button.frame = CGRectMake(0.0, 0.0, 100.0, 60.0);
    [self.view addSubview:button];


    // Do any additional setup after loading the view from its nib.









- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView

    NSLog(@" ");
    NSLog(@" Scroll View Did End Decelerating");
    NSLog(@" ");  





- (void)scrollViewDidScroll:(UIScrollView *)scrollView

    NSLog(@" ");
    NSLog(@" Scroll View Did End Scroll ! ! ! ");
    NSLog(@" ");  


本质上问题是上面的两种方法scrollViewDidEndDecleratingscrollViewDidScroll 没有打印。换句话说,他们没有被调用。

有什么想法吗?

【问题讨论】:

【参考方案1】:

问题在于语句的顺序:

self.scroll.delegate = self;
...
scroll = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];

您尝试在创建滚动视图之前设置委托,因此该语句无效,因为scrollnil。改为这样做:

self.scroll = [[[UIScrollView alloc] initWithFrame:CGRectMake(...)] autorelease];
self.scroll.delegate = self;

我刚刚注意到你的评论:

// Why does this get released? Wouldn't it then dissappear from the scroll view? Should I not be releasing other objects from above?
[awesomeView release];

是的,您应该在将targetViewtargetNameLabelmissionNameLabel 添加到滚动视图后释放它们。您拥有它们是因为您创建了它们(通过 alloc-init),并且您必须通过向它们发送 release 消息来放弃它们的所有权。当您将它们添加到 scrollView 时,它将按照 addSubview: 的文档中的说明保留它们,以确保它们在 scrollView 需要它们时不会被释放。

【讨论】:

【参考方案2】:

代替

- (void)viewDidLoad

    // Here I have also tried scroll.delegate = self;
    self.scroll.delegate = self;
    self.view.backgroundColor = [UIColor redColor];
    scroll = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];

你应该这样做

- (void)viewDidLoad

    self.view.backgroundColor = [UIColor redColor];
    scroll = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];

    self.scroll.delegate = self;

【讨论】:

以上是关于UIScrollViewDelegate 没有触发的主要内容,如果未能解决你的问题,请参考以下文章

未调用 UIScrollViewDelegate 函数

为啥我的 UIScrollViewDelegate 没有在快速操场上被调用?

在 UICollectionView 子类中实现 UIScrollViewDelegate

覆盖scrollViewDidScroll时的问题,但不是UIScrollViewDelegate的所有其他方法

成为 UITableView 的 UIScrollViewDelegate 代表

从 UITableView 的子类访问 UIScrollViewDelegate