为什么我在响应链的视图的UIViewController?(Why isn't my UIV

2019-07-05 12:19发布

我写的UIViewController的子类,编程方式创建一个视图,而不是从护理文件加载它。

它有一个简单loadView方法:

- (void)loadView
{
    UIScrollView *mainScrollView =
        [[UIScrollView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.view = mainScrollView;
    [mainScrollView release];
}

......然后,我做我的初始化的散装viewDidLoad ,作为记录。 它所有的工作,我可以看到在它我的自定义视图滚动视图。

我需要一个UIViewController自己的观点,因为它是一个UINavigationBar的工作流程的一部分。 因为我有一个控制器对象,我宁愿它做控制器的东西。

这个问题的话,就是我的视图控制器似乎并不在响应链。 touchesBegan:withEvent: ,如果我在根视图或子视图定义它被调用,但如果它是在视图控制器本身。

苹果事件处理文档流畅地提到了视图控制器应该在响应链 。 UIViewController的文件没有提到需要超出指定根视图到额外的步骤self.view属性,如我之前所做的那样。 UIResponder文档声称一个UIView应该弄清楚,如果它有一个控制器和事件传递给它。 UIScrollView的文件说什么都没有。

我也尝试了各种设置userInteractionEnabled:为所有视图和子视图,没有运气。

我在想什么?

Answer 1:

ERICB,触摸向下发送,只有当他们没有被处理的响应链。 很明显的UIScrollView处理所有触摸事件,所以它的nextResponder它不会发送任何东西。 让我感觉良好。

你真正需要的是“过滤器”触摸事件之前,他们被的UIScrollView的滚动逻辑处理。 但需要注意的是响应链是此作业的错误的工具,正是因为它不允许拦截事件,他们得到处理之前。

也许在你的情况下,最好的解决办法是继承的UIScrollView,覆盖触摸方法(的touchesBegan等),并调用之前手动发送事件委托[super touchesXxx]



Answer 2:

我认为问题是,UIScrollView中有很多的bug,以及解决方法的错误,并在解决方法的错误:)错误。

你经常要继承它对于解决不了任何其他方式等原因,所以如果你想重新使用你的代码,尽量不要 - 它是由一个事实,即继承的UIScrollView通常是从长远来看,一个坏主意复杂要继承它,直到你绝对必须的。

该工程始终,我发现最简单的解决方法是使你的内容查看一个微小的UIView子类 - 铭记自身通过UIScrollView的需要永远改变你的内容视图(例如,如果您启用变焦 - 苹果有一些错误到至少iOS版6那一脚在当你改变现有的滚动视图的内容视图),所以这是一个好主意,让琐碎,并把它里面的自定义视图作为子视图。

注意:这一直为我工作,在多个应用程序发货。 如果有问题,我还没有看到它。 我不知道为什么苹果没有实现这个简单的改变自己,除非有与它一个微妙的问题,我还没有遇到呢!

用法:

/** Inside your UIViewController, wherever you set the root content view
of your UIScrollView, you have to also tell the custom class "I am the nextResponder!"
*/
-(void)viewDidLoad
{
    self.scrollView.contentSize = self.viewEmbeddedInScrollview.frame.size;
    self.viewEmbeddedInScrollview.nextResponderHeyAppleWhyDidYouStealThis = self;
}

接口文件+类文件:

#import <UIKit/UIKit.h>

@interface UIViewThatNeverLosesItsNextResponder : UIView

@property(nonatomic,retain) UIResponder* nextResponderHeyAppleWhyDidYouStealThis;

@end



#import "UIViewThatNeverLosesItsNextResponder.h"

@implementation UIViewThatNeverLosesItsNextResponder

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
    }
    return self;
}

@synthesize nextResponderHeyAppleWhyDidYouStealThis;

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [nextResponderHeyAppleWhyDidYouStealThis touchesBegan:touches withEvent:event];
}

-(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
    [nextResponderHeyAppleWhyDidYouStealThis touchesCancelled:touches withEvent:event];
}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    [nextResponderHeyAppleWhyDidYouStealThis touchesEnded:touches withEvent:event];
}

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    [nextResponderHeyAppleWhyDidYouStealThis touchesMoved:touches withEvent:event];
}

@end


Answer 3:

的UIScrollView将延迟默认内容触摸; 你看着-delaysContentTouches以确保接触会通过。



文章来源: Why isn't my UIViewController in the responder chain for its view?