iOS iPad App:代理人没有使用两个UIScrollViews和一个UIPageControl(用于分页的委托函数未调用)来调用ViewController

时间:2013-01-09 21:46:50

标签: ios5 uiscrollview uipagecontrol uiscrollviewdelegate

对于我的iPad应用程序,我有一个主ViewController,它包含两个UIScrollviews和一个UIPageControl。 问题是没有调用分页的代理。 这是布局:

enter image description here

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

我在VC

中声明了scrollviews和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>

我在VC的.m文件中实现了以下UIScrollViewDelegate委托函数。

- (void)scrollViewDidScroll:(UIScrollView *)sender;
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView;
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView;

视图出现但是当我在按钮上滑动时,我看不到上面的委托函数被调用。

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

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

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

// ImageBrowseViewController.h
// (NOTE - In Interface Builder I have added a tag attribute of 0 to mainScrollView
//  and 1 to thumbScrollView, to enable me to distinguish which scrollView the delegate 
//  needs to respond to)



#define TAG_MAIN_SCROLLVIEW 0
#define TAG_THUMB_SCROLLVIEW 1

@interface ImageBrowseViewController : UIViewController<UIScrollViewDelegate>
{
    UIButton* currentlySelectedButton;
    UIScrollView *mainScrollView;
    UIScrollView *thumbScrollView;
    UIPageControl* pageControl;
    BOOL pageControlBeingUsed;

}

@property (strong, nonatomic) IBOutlet UIScrollView *mainScrollView;
    // … connected as outlet in IB to mainScrollView
@property (strong, nonatomic) IBOutlet UIScrollView * thumbScrollView;
    // … connected as outlet in IB to thumbScrollView
@property (strong, nonatomic) IBOutlet UIPageControl *pageControl;
    // … connected as outlet in IB to pageControl


…
-(IBAction)changePage; //Touch up Inside IBAction connected to pageControl


…
@end

这是主视图控制器的实现文件,它控制两个scrollviews和pagecontrol(相关的EXCERPTS - 告诉我如果您需要更多)

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

1 个答案:

答案 0 :(得分:1)

您将所有外观编码为100%(除了这个错误:@synthesize floorplanThumbScrollView;,但这不是您的问题。)

我确信答案是您没有在IB中正确连接您的滚动视图 DELEGATES

这是线索:

  

“是的,我已经在Interface Builder中设置了所有这三个。所以mainScrollView,thumbScrollView和pageControl在IB中连接到VC的.h文件中的上述声明。”

ViewController和scrollView之间需要2个连接。

(1)ctrl-drag FROM viewController to scrollView,连接到IBOutlet属性 这就是你所做的。

(2)ctrl-drag FROM scrollView to viewController,连接到delegate 我认为你没有这样做过。

第2步的说明

UIScrollView有一个名为“delegate”的内置属性。 scrollView使用此属性向其委托发送消息。您可以在界面构建器中设置此委托(步骤2),也可以在代码中执行此委托。例如,在viewController中,您可以这样做:

    [myScrollView setDelegate:self];

将viewController设置为myScrollView的委托。如果您通过在Interface Builder中链接来执行此操作,则不需要此代码(并且IB不会创建任何代码)。

这实际上做的是将scrollView的委托iVar设置为指向viewController的指针。使用这样的委托的好处是委托人(UIScrollView)不必知道委托人的任何事情(在这种情况下你的UIViewController)。只要我们遵守它的委托协议,这就允许我们重用UIScrollView。

每当scrollView需要通知它的委托时,它会在内部发送一条这样的消息..

    [self.delegate scrollViewDidScroll:self];

(你没有看到它,它在scrollView的实现中)。

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

要确定需要哪些方法,请阅读UIScrollView class reference,其中告诉您:

  

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

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

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