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