我最近遇到的问题是无法在touchesMoved
内注册触摸事件(UIScrollView
等)。在与很多人交谈并阅读大量帖子之后,事实证明UIScrollView
不接受触摸本身,而是需要将触摸传递给UIScrollView
子类。
我对objective-c非常新,并且我正在围绕如何定义子类(在单独的.h / .m文件中或以某种方式在@interface或其他内容中)以及iOS如何处理这个非常糟糕的时间与响应者链。
请让我描述一下我的确切情况,任何愿意解释我需要做什么的人都会非常感激。
我的应用中有一个页面,我将其默认UIView
更改为UIScrollView
,因此,如果我在InterfaceBuidler
中进行检查,我看到的只是SampleViewController
和UIScrollView
。我将UIScrollView
与@Interface
的{{1}}关联起来,如下所示:
SampleViewControler.h
我在#import <UIKit/UIKit.h>
@interface SampleViewController : UIViewController
{
}
@property (strong, nonatomic) IBOutlet UIScrollView *mainScroller;
@end
中引用了UIScrollView
,就像这样:
SampleViewController.m
如果我将#import "SampleViewController.h"
@interface SampleViewController ()
@end
@implementation SampleViewController
@synthesize mainScroller = _mainScroller;
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
NSLog(@"Movement!");
}
-(void)viewWillAppear:(BOOL)animated
{
[_mainScroller setContentOffset:CGPointMake(0,0) animated:YES];
}
的类更改为UIScrollView
,则会检测到触摸并触发一些UIView
消息。但是,将NSLog
设置回UIView
后,将忽略触摸。
根据我的理解,我需要使用代码
设置UIScrollView
的子类
UIScrollView
...然后将我的SampleViewController.m更改为代码:
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
NSLog(@"Movement!");
}
然而,我真的不明白1)如何设置这样一个子类,2)为什么这会起作用,因为我不明白为什么- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
[[self.nextResponder nextResponder] touchesMoved:touches withEvent:event];
}
首先从内部被调用[[self.nextResponder nextResponder] touchesMoved:touches withEvent:event];
,因为我的类似SampleViewController.m
语句从未执行过。
我已经尝试了所有可以找到的教程,并且正在转向SE的专业知识!感谢。
答案 0 :(得分:1)
你在考虑这个错误。如果您想知道scrollView何时移动,则无需对其进行子类化。 iOS已在UIScrollViewDelegate
内设置了您需要的所有方法。如果您想说,请在scrollView中为物品选择touchEvents,那就完全可以了。然后,您需要将scrollView中的项子类化,然后在相应的类中拾取touchEvents。但是对于标准的scrollView方法,您应该将其设置为:
·H
#import <UIKit/UIKit.h>
@interface SampleViewController : UIViewController<UIScrollViewDelegate>
{
}
@property (strong, nonatomic) IBOutlet UIScrollView *mainScroller;
@end
.M
#import "SampleViewController.h"
@interface SampleViewController ()
@end
@implementation SampleViewController
@synthesize mainScroller = _mainScroller;
-(void)viewDidLoad
{
self.mainScroller.delegate=self;//Adopt the delegate for the scrollView..this is the important line
}
然后只需实现UIScrollViewDelegateMethods来抓取移动等。当试图在scrollView / tableView中拾取touchEvents时会发生未定义的行为,因为scrollView本身已经在幕后实现了那些touchEvents
查看Developer站点上的所有方法,并在.M文件中实现它们。由于您已在viewDidLoad中采用了委托,因此这些将是您的scrollView回调。我之前已经列出了其中一些,但继续查看UIScrollViewDelegate Protocol site
– scrollViewDidScroll:
– scrollViewWillBeginDragging:
– scrollViewWillEndDragging:withVelocity:targetContentOffset:
– scrollViewDidEndDragging:willDecelerate:
– scrollViewShouldScrollToTop:
– scrollViewDidScrollToTop:
– scrollViewWillBeginDecelerating:
– scrollViewDidEndDecelerating:
答案 1 :(得分:0)
我几天前发布了一个类似问题的答案,可能对你有所帮助。请参阅this question和my answer。
看起来你已经接近工作了,但你对于放置touchesMoved
方法的位置感到有些困惑。
在UIScrollView
的子类中,您应该:
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
[[self.nextResponder nextResponder] touchesMoved:touches withEvent:event];
}
在SampleViewController.m
文件中:
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
NSLog(@"Movement!");
}
(在你的问题中你有另外两种方式。)