使UIScrollView成为第一响应者

时间:2013-02-11 17:43:14

标签: objective-c cocoa-touch first-responder

我创建了一个准系统iOS应用程序,它将一个UIScrollView添加到Window(没有ViewControllers或UIViews - 我只是这样做,看看我是否能理解发生了什么。)

我想要的只是在设备被动摇时通知UIScrollView。

我已经将UIScrollView子类化以实现canBecomeFirstResponder方法:

#import "SampleScrollView.h"

@implementation SampleScrollView

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

- (BOOL)canBecomeFirstResponder
{
    return YES;
}

在我的AppDelegate中,我创建了一个SampleScrollView对象,添加到Window,然后尝试将其设置为第一响应者:

#import "SampleScrollView.h"

@implementation ResponderTestAppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];


    // Override point for customization after application launch.

    CGRect thisFrame = [[self window] bounds];
    SampleScrollView *myScrollView = [[SampleScrollView alloc] initWithFrame:thisFrame];

    // Set scrollview to be the first responder
    BOOL success = [myScrollView becomeFirstResponder];
    if (success)
    {
        NSLog(@"myScrollView is first responder");
    }
    else
    {
        NSLog(@"Not first responder.");
    }

这是一个高度简化的示例,但由于某种原因,我无法让应用程序将SampleScrollView对象报告为第一响应者。我确定我错过了一些非常简单的事情,对吗?

1 个答案:

答案 0 :(得分:0)

在您的示例中,您没有将滚动视图添加到任何超级视图。尝试在调用[self.window addSubview: myScrollView];之前添加此行becomeFirstResponder

becomeFirstResponder上的文档说明了

  

您可以调用此方法来创建响应者对象,例如查看第一响应者。但是,如果它是视图层次结构的一部分,则只应在该视图上调用它。如果视图的window属性包含UIWindow对象,则它已安装在视图层次结构中;如果它返回nil,则视图将从任何层次结构中分离。