2012-04-05 2 views
2

BNR의 iOS 프로그래밍 책 7 장에서 작업 중이며 문제가 있습니다. 이 장의 시작 부분에서는 이전 장에서 모션 이벤트에 응답 한 UIView (HypnosisView)를 사용하여 UIViewController (HypnosisViewController)를 설정했습니다.상위 UIViewController가 RootViewController로 설정된 경우 UIView가 첫 번째 응답자가되지 않습니다.

내가이 (가) AppDelegate.m 파일의 UIViewController 만들 :

- (void)loadView 
{ 
    // Create a view 
    CGRect frame = [[UIScreen mainScreen] bounds]; 
    HypnosisView *view = [[HypnosisView alloc] initWithFrame:frame]; 
    [self setView:view]; 

    [view becomeFirstResponder]; 
} 

그리고 HypnosisView에서

내가 YES 반환 할 수 있는지 확인하십시오 HypnosisViewController에서

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    ... 
    HypnosisViewController *hvc = [[HypnosisViewController alloc] init]; 
    [[self window] setRootViewController:hvc]; 
    ... 
} 

을, 나는 첫 번째로 반응이 될 HypnosisView 설정 canBecomeFirstResponder에. 불행히도, 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에 대해 무엇을 놓치고 있습니까?

감사합니다.

답변

2

귀하의 질문은 매우 적절합니다. 나는 또한 같은 책을 공부하고 있으며 같은 장에 있습니다. 문제는 UITabBarController를 사용하기 전에 HypnosisViewController 또는 TimeViewController를 사용한다는 것입니다. 그런 다음 AppDelegate.m 파일에서 [self.window setRootViewController : hvc] 또는 [self.window setRootViewController : tvc]를 수행합니다. 이 경우 setRootViewController 메서드는 내부적으로 loadView 메서드를 호출합니다. 따라서 loadView가 호출되어야한다면 becomeFirstResponder (코드 내에서 메소드 호출로 내부에 상주 함)도 트리거되어야합니다. 그래서 내부적으로 canBecomeFirstResponder가 호출되어야합니다. 이제 우리가 UITabBarController를 사용할 때 일이 깨지는 경향이 있습니다. loadView가 '[[self window] setRootViewController : tabBarController];를 통해 호출되는 대신에 무슨 일이 발생합니까? 'tabBarController setViewControllers : viewControllers];'를 통해 호출됩니다. 따라서 bottomline은 rootViewController 속성 (tabBarController로 설정된 경우)이 loadView 메소드를 호출하지 않아 'becomeFirstResponder'가 호출되지 않는다는 것입니다. loadView는 '[tabBarController setViewControllers : viewControllers];'를 통해 호출 될 것이라고 주장 할 수 있습니다. setViewControllers는 root viewController를 설정하는 데 사용되지 않습니다. 이 문제가 발생하면 becomeFirstResponder를 명시 적으로 호출했습니다. 방법은 다음과 같습니다. -

@implementation HypnoTimeAppDelegate 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions //method of UIApplicationDelegate protocol 
{ 
    NSLog(@"lets begin"); 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    // Override point for customization after application launch. 
    HypnosisViewController *viewController= [[HypnosisViewController alloc] init]; 

    TimeViewController *viewController2= [[TimeViewController alloc] init]; 


    NSLog(@"view controllers are done initializing!"); 

    UITabBarController *tabBarController= [[UITabBarController alloc] init]; 
    NSArray *viewControllers= [NSArray arrayWithObjects:viewController,viewController2, nil]; 

    [tabBarController setViewControllers:viewControllers];//loadView of HypnosisViewController gets called internally since the 'app view' isn't going to load from a XIB file but from 'HypnosisView.m'.loadView method of TimeViewController loads its own view from the XIB file. 

    [self.window setRootViewController:tabBarController]; 

    self.window.backgroundColor = [UIColor whiteColor]; 

    [self.window makeKeyAndVisible]; 

    return YES; 
} 

@implementation HypnosisViewController 

-(void)loadView{ 

    NSLog(@"HypnosisView loading..."); 
    HypnosisView *myView= [[HypnosisView alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    self.view= myView; 
    [self configureFirstResponder];//configuring first responder 
} 



-(void) configureFirstResponder{ 
     BOOL viewDidBecomeFirstResponder= [self.view becomeFirstResponder]; 
     NSLog(@"Is First Responder set as HypnosisView? %i",viewDidBecomeFirstResponder); 

    } 
관련 문제