我正在编写 BNR 的 iOS 编程书的第 7 章,但遇到了问题。在本章的开头,我设置了一个 UIViewController (HypnosisViewController) 和一个 UIView (HypnosisView),它响应上一章中的运动事件。
我在 AppDelegate.m 文件中创建 UIViewController:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
...
HypnosisViewController *hvc = [[HypnosisViewController alloc] init];
[[self window] setRootViewController:hvc];
...
}
在 HypnosisViewController 中,我将 HypnosisView 设置为第一响应者:
- (void)loadView
{
// Create a view
CGRect frame = [[UIScreen mainScreen] bounds];
HypnosisView *view = [[HypnosisView alloc] initWithFrame:frame];
[self setView:view];
[view becomeFirstResponder];
}
在 HypnosisView 中,我确保向 canBecomeFirstResponder 返回 YES。不幸的是,HypnosisView 没有像以前那样响应运动事件。当我最终继续前进时,我有了一个有趣的发现。如果我将 HypnosisViewController 移动到 UITabBarController 中,HypnosisView 开始响应运动事件。代码看起来像这样:
HypnosisViewController *hvc = [[HypnosisViewController alloc] init];
UITabBarController *tabBarController = [[UITabBarController alloc] init];
NSArray *viewControllers = [NSArray arrayWithObjects:hvc, <insert more objs here>, nil];
[tabBarController setViewControllers:viewControllers];
[[self window] setRootViewController:tabBarController];
为什么 HypnosisViewController 设置为 RootViewController 时 HypnosisView 没有成为第一响应者?为什么将 HypnosisViewController 放在另一个控制器中后它就开始工作了?我对 RootViewController 缺少什么?
谢谢!