使 UIScrollView 成为第一响应者
Posted
技术标签:
【中文标题】使 UIScrollView 成为第一响应者【英文标题】:Make UIScrollView a first responder 【发布时间】:2013-02-11 17:43:13 【问题描述】:我创建了一个准系统 ios 应用程序,它向窗口添加了一个 UIScrollView(没有 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 对象,添加到窗口中,然后尝试将其设置为第一响应者:
#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】:在您的示例中,您没有将滚动视图添加到任何超级视图。尝试在调用 becomeFirstResponder
之前添加此行 [self.window addSubview: myScrollView];
。
becomeFirstResponder
上的文档指出
您可以调用此方法来使响应者对象(例如视图)成为第一响应者。但是,只有当它是视图层次结构的一部分时,您才应该在该视图上调用它。如果视图的 window 属性包含一个 UIWindow 对象,则它已安装在视图层次结构中;如果它返回 nil,则视图与任何层次结构分离。
【讨论】:
就是这样!我还没有把它放到层次结构中。我知道它必须是小东西。随时为我提供测试服务:P以上是关于使 UIScrollView 成为第一响应者的主要内容,如果未能解决你的问题,请参考以下文章
如何使表格单元格中的 UITextField 成为第一响应者?
如何使第一个文本输入成为第一响应者并使用 Eureka 表单显示键盘?
使 UITextField 子视图成为 UITableView 中的第一响应者时出错