Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

UIScrollViewDelegate not firing

This may be some sort of duplicate of this question. But I've tried to apply it's answers to no avail.

I have a UIScrollView with pagingEnabled. I would like to use UIScrollViewDelegate to help detect which page I'm on. Here is my code:

@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(@" ");  

}

Essentially the problem is that the two methods above, scrollViewDidEndDeclerating and scrollViewDidScroll are not printing. In other words they are not getting called.

Any ideas?

like image 375
Eric Brotto Avatar asked Dec 05 '22 20:12

Eric Brotto


1 Answers

The problem lies in the order of the statements:

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

You attempt to set the delegate before you create the scrollview so the statement has no effect because scroll is nil. Do this instead:

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

I just noticed your comment:

// 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];

Yes, you should be releasing targetView, targetNameLabel and missionNameLabel after you add them to the scrollView. You own them because you created them (via alloc-init) and you must relinquish ownership of them by sending a release message to them. When you add them to the scrollView, it will retain them as stated in the documentation of addSubview: to make sure they don't get deallocated while the scrollView needs them.

like image 149
albertamg Avatar answered Dec 25 '22 08:12

albertamg