UIViewController 上的 UIScrollView

Posted

技术标签:

【中文标题】UIViewController 上的 UIScrollView【英文标题】:UIScrollView on a UIViewController 【发布时间】:2009-11-14 16:26:20 【问题描述】:

我正在处理应用程序的菜单。现在的问题是我无法让 UIScrollView 工作。 UIScrollView 位于 Xib 文件中。 它加载正常,但是当我尝试滚动时它崩溃了。

我认为问题在于我使用了 UIViewController,因为当我将委托而不是自身移除时,它正在工作。现在我得到了:scrollView.delegate = self;

当委托是 appDelegate 时,它​​正在工作,但这不是我想要的。

我在课堂上使用的以下函数:

(void)loadScrollViewWithPage:(int)page (void)scrollViewDidScroll:(UIScrollView *)sender (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView

我想我有两个选择。使用视图(这可能)或作为 UIScrollview 委托的对象创建 NSObject。

我给出的错误是:

2009-11-14 17:50:25.723 Par23[1240:20b] * -[NSCFType scrollViewDidScroll:]:无法识别的选择器发送到实例 0x4834190 2009-11-14 17:50:25.724 Par23[1240:20b] * 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“***-[NSCFType scrollViewDidScroll:]:无法识别的选择器发送到实例 0x4834190 '

不是功能问题。当我删除函数中的所有代码时,它仍然给出了这个错误

滚动视图有以下设置: scrollView.pagingEnabled = YES; scrollView.contentSize = CGSizeMake(scrollView.frame.size.width * kNumberOfPages, scrollView.frame.size.height); scrollView.showsHorizo​​ntalScrollIndicator = NO; scrollView.showsVerticalScrollIndicator = NO; scrollView.scrollsToTop = 否; scrollView.delegate = self;

【问题讨论】:

【参考方案1】:

我在 UIScrollViewDelegte 上遇到了同样的问题。我正在将创建 UIScrollView 的视图控制器设置为该 UIScrollView 的委托,并且我还遇到了上面列出的 unrecognized selector sent to instance 问题。

在我的视图控制器中,这段代码崩溃了。

    // create the scrollview
    scrollView = [[UIScrollView alloc] initWithFrame:scrollFrame];

    // add content view to the scrollView
    scrollView.contentSize = contentFrame.size;
    scrollView.scrollEnabled = YES;
    scrollView.clipsToBounds = YES;
    scrollView.delegate = self;
    [scrollView addSubview:contentView];

我通过子类化 UIScrollView 并将其设为委托来解决此问题。所以现在我的 scrollView 是它自己的代表。这是修改后的代码。

    // create the scrollview
    scrollView = [[PMStickyHeaderScrollView alloc] initWithFrame:scrollFrame];

    // add content view to the scrollView
    scrollView.contentSize = contentFrame.size;
    scrollView.scrollEnabled = YES;
    scrollView.clipsToBounds = YES;
    scrollView.delegate = scrollView;  // notice that the scrollView is its own delegate
    [scrollView addSubview:contentView];

这个解决方法对我来说已经足够了。这是我的 scrollView 子类的简单实现。

@interface PMStickyHeaderScrollView : UIScrollView <UIScrollViewDelegate> 
@end

@implementation PMStickyHeaderScrollView

- (void)scrollViewDidScroll:(UIScrollView *)sView

    NSLog(@"scrollViewDidScroll %@", [sView description]);


@end

对于它的价值,我认为问题的根本原因是在设置 UIScrollView 的委托时 UIScrollView 对响应者链的处理不正确,但我没有看到任何关于此的错误报告。我正在使用 iPhone 3.0 SDK。其他人都在用什么?对于这个问题还有其他聪明的解决方法吗?

【讨论】:

我只添加了“scrollView.delegate = scrollView;”成功了,谢谢【参考方案2】:

将 ScrollView 的委托设置为 ViewController 无疑是一种可接受的设计。您需要在模拟器中运行应用程序时打开控制台以查看错误是什么。如果没有错误日志,几乎无法诊断。

此外,您可能需要考虑将代码发布到您的滚动视图委托函数。

【讨论】:

【参考方案3】:

我遇到了同样的问题。当我将视图控制器(具有滚动视图)添加到视图后停止释放时,意外修复了它。我不确定为什么会发生这种情况,因为我确信在将视图控制器添加到视图后释放它是正确的做法,因为我没有对它做任何其他事情。

【讨论】:

†他应该作为评论而不是答案发布。

以上是关于UIViewController 上的 UIScrollView的主要内容,如果未能解决你的问题,请参考以下文章

UIPageViewController 从子 UIViewController 上的控制过渡

UIViewController 上的 UIScrollView

带有数组信息的 UIViewController 上的 TableView [关闭]

instantiateViewControllerWithIdentifier 上的自定义 UIViewController

为啥我不能在 Swift 中调用 UIViewController 上的默认 super.init()?

单个 UIViewController 上的 2 个 UICollectionViews,具有不同数量的部分