Ios5 iOS iPad应用程序:未调用具有两个UIScrollView和一个UIPageControl的ViewController的代理(未调用分页的代理函数)

Ios5 iOS iPad应用程序:未调用具有两个UIScrollView和一个UIPageControl的ViewController的代理(未调用分页的代理函数),ios5,uiscrollview,uipagecontrol,uiscrollviewdelegate,Ios5,Uiscrollview,Uipagecontrol,Uiscrollviewdelegate,对于我的iPad应用程序,我有一个主ViewController,其中包含两个UIScrollView和一个UIPageControl。 问题是没有调用分页的委托。 布局如下: 在下方的thumbScrollView中选择一个按钮需要更新主ScrollView中的图像(此操作有效)滑动thumbScrollView或在页面控件上选择一个点需要“翻页”thumbScrollView以显示上一组按钮。刷卡不起作用,因为没有调用委托函数 我在VC中声明ScrollView和pagecontrol,如

对于我的iPad应用程序,我有一个主ViewController,其中包含两个UIScrollView和一个UIPageControl。 问题是没有调用分页的委托。 布局如下:

在下方的thumbScrollView中选择一个按钮需要更新主ScrollView中的图像(此操作有效)滑动thumbScrollView或在页面控件上选择一个点需要“翻页”thumbScrollView以显示上一组按钮。刷卡不起作用,因为没有调用委托函数

我在VC中声明ScrollView和pagecontrol,如下所示

@property (strong, nonatomic) IBOutlet UIScrollView *mainScrollView;
@property (strong, nonatomic) IBOutlet UIScrollView *thumbScrollView;
@property (strong, nonatomic) IBOutlet UIPageControl *pageControl;
ViewController实现UIScrollViewDelegate

@interface MyViewController : UIViewController<UIScrollViewDelegate>
视图出现,但当我在按钮上滑动时,我没有看到上面的委托函数被调用

在StackOverflow中,我还没有找到解决这个问题的方法,尽管我已经考虑了其他相关帖子中关于这个问题的建议(例如,区分哪个scrollview启动了这个操作的逻辑等)

在此处添加详细代码(根据@HeWas的要求)

这是控制两个ScrollView和pagecontrol的主视图控制器的头文件(相关摘录-如果需要更多,请告诉我)

您编写的代码看起来都是100%(除了这个输入:
@synthetic floorplanThumbScrollView;
,但这不是您的问题)

我确信答案是您没有在IB中正确连接scrollview代理

这就是线索:


是的,我在Interface Builder中设置了所有三个。因此,mainScrollView、thumbScrollView和pageControl在IB中连接到VC的.h文件中的上述声明

在ViewController和ScrollView之间需要2个连接

(1) ctrl键从viewController拖动到scrollView,连接到IBOutlet属性。
这就是你所做的

(2) ctrl键从scrollView拖动到viewController,连接到代理 我认为你没有这样做

步骤2的说明

UIScrollView有一个名为“委托”的内置属性。scrollView使用此属性向其委托发送消息。您可以在interface builder(步骤2)中设置此委托,也可以在代码中设置。例如,在viewController中,可以执行以下操作:

    [myScrollView setDelegate:self];
这会将viewController设置为myScrollView的代理。如果通过在InterfaceBuilder中链接来实现,则不需要此代码(IB也不创建任何代码)

无论哪种方式,它实际上都会将scrollView的委托iVar设置为指向viewController的指针。像这样使用委托的好处是,委托人(UIScrollView)不必了解被委托人(在本例中是您的UIViewController)。这允许我们重用UIScrollView,只要我们遵守它的委托协议

每当scrollView需要通知其委托时,它会在内部发送如下消息

    [self.delegate scrollViewDidScroll:self];
(您没有看到,它在scrollView的实现中)

设置为scrollView委托的对象需要实现scrollView委托协议声明的所有必需方法,并且可以选择实现任何可选委托方法

要确定需要哪些方法,请阅读,它告诉您:

UIScrollView类可以有一个必须采用UIScrollViewDelegate协议的委托。要使缩放和平移工作正常,学员必须同时实现
viewForZoomingInScrollView:
scrollViewDidEndZooming:withView:atScale:
;此外,最大(
最大缩放比例
)和最小(
最小缩放比例
)缩放比例必须不同

协议中的所有其他内容都是可选的


此委托模式是您可以轻松实现自己的对象重用的模式,也是objective-C中在解耦对象之间传递消息的最常见方式之一。

第一个明显的问题是,您是否在ScrollView上设置了委托?是在代码中还是在界面生成器中连接?是的,我已经在界面生成器中设置了所有三个。因此,mainScrollView、thumbScrollView和pageControl在IB中连接到VC的.h文件中的上述声明。这是为在iOS 5.1 iPad模拟器上运行而编写的。我还为pageControl编写了一个changePage函数,并将其设置为“touchupinside”iAction。当我在pagecontrol上手动选择一个点时,会调用此函数,但无论我在thumbScrollView上执行什么操作,都不会调用委托函数scrollViewDidScroll等。@HeWas-请参阅我的评论,这些评论可以回答您的问题(感谢您在这方面的帮助),非常完美!我就这么做了,效果很好!非常感谢!:-)现在,在看到它工作的兴奋中,我不想失去这个学习机会!你能重述一下缺失的步骤(即步骤2)的作用吗?它确实解决了这个问题,但我没有注意到ImageBrowseViewController.h代码中有任何更改。这一步(第2步)背后的基本原理是什么?@CoolDocMan,请参阅扩展答案A我现在明白了!是的,正如你所说,我错过的那一步是。。。[myScrollView setDelegate:self]感谢您如此清晰的解释,并教育我如何使用这些工具,同时也感谢您提供了方便的替代方法—使用IB设置scrollview的委托!
//
//  ImageBrowseViewController.m
//

    …
@synthesize mainScrollView;
@synthesize thumbScrollView;
@synthesize pageControl;


// UIScrollViewDelegate
- (void)scrollViewDidScroll:(UIScrollView *)sender {

    if ( [sender tag] == TAG_THUMB_SCROLLVIEW ) {
        // This is the thumbScrollview
        // Update the page when more than 50% of the previous/next page is visible

        CGFloat pageWidth = self.thumbScrollView.frame.size.width;
        int page = 
            floor((self.thumbScrollView.contentOffset.x - pageWidth / 2) / pageWidth) 
            + 1;
        self.pageControl.currentPage = page;

    }
}
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
    pageControlBeingUsed = NO;
}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
    pageControlBeingUsed = NO;
}

- (IBAction)changePage {
    // Update the scroll view to the appropriate page
    CGRect frame;
    //frame.origin.x = self.scrollView.frame.size.width * self.pageControl.currentPage;
    frame.origin.x = self.thumbScrollView.frame.size.width * self.pageControl.currentPage;

    frame.origin.y = 0;
    frame.size = self.thumbScrollView.frame.size;
    [self.thumbScrollView scrollRectToVisible:frame animated:YES];

    // Keep track of when scrolls happen in response to the page control
    // value changing. If we don't do this, a noticeable "flashing" occurs
    // as the the scroll delegate will temporarily switch back the page
    // number.
    pageControlBeingUsed = YES;
}
    [myScrollView setDelegate:self];
    [self.delegate scrollViewDidScroll:self];