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.showsHorizontalScrollIndicator = 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