2009-11-10 2 views
0

Я пытаюсь получить subview, чтобы стать firstResponder. Я понимаю, что это делается в методе viewDidAppear, например, так:как сделать subview firstResponder

- (void)viewDidAppear { 
    [self becomeFirstResponder]; 
} 

в то время как переопределение canBecomeFirstResponder вернуть YES:

- (BOOL)canBecomeFirstResponder { 
    return YES; 
} 

однако, когда я вставить подвид в методе viewDidLoad своего родительского вида в:

- (void)viewDidLoad { 
    subViewController = [[SubViewController alloc] init]; 
    [self.view insertSubview: subViewController.view atIndex: 0]; 
    [subViewController viewDidAppear: NO]; 
    [super viewDidLoad]; 

}

(я вызову DidAppear вручную, потому что он не запускается автоматически), subview не становится firstResponder.

Почему subview не становится первым ответчиком? и как я могу сделать это firstResponder?

спасибо,

mbotta

Кстати, это переписывание мой первоначальный вопрос:

я пытаюсь создать приложение iphone, где объект RootViewController управляет двумя подвидами, один из которых должен реагировать на пользователя, встряхивающего его iphone.

после некоторого копания, я пришел к выводу, что subview должен быть сделан первымResponder в своем представлении viewDidAppear. кроме того, метод canBecomeFirstResponder должен быть изменен для возврата YES.

так вот что происходит: я создаю экземпляр rootviewcontroller в делегате приложения. в своем методе viewDidLoad я расскажу об этом в addSubView firstViewController. все это работает просто красиво.

Однако firstViewController не реагирует на какое-либо дрожание. я посыпал некоторые NSLogs и обнаружил, что, пока мы говорим firstViewController в canBecomeFirstResponder, чтобы вернуть ДА, и пока мы говорим об этом [self стать FirstResponder] в viewDidAppear, на самом деле это не firstResponder.

так, мои вопросы: 1) действительно ли подзадача должна быть первым ответчиком, чтобы реагировать на тряску? a) Если нет, то как заставить подзону реагировать, не будучи первым ответчиком? 2) как сделать подзаголовок firstResponder?

Интересно, что если я выполняю ту же последовательность (canBecomeFirstResponder, [self firstResponder], motionBegan :) в другом проекте с одним контроллером, все работает безупречно. ясно, я должен ударить дизайнерский недостаток моего собственного дела.

спасибо,

mbotta

ответ

1

Не 100% уверен, но это может быть ваша проблема. Если бы мы могли видеть способы оскорбления, это могло бы быть проще.

Из Event Handling Best Practices (выделено мной):

Если обрабатывать события в подклассе UIView, UIViewController, или (в редких случаях) UIResponder,

  • Вы должны реализовать все методы обработки событий (даже если это нулевая реализация).
  • Не называйте реализацию суперкласса методов.

Если вы вызываете методы суперкласса события, вероятно, получать переправляется в nextResponder.

EDIT

Ссылка Event Handling Best Practices выше мертва. Я не мог найти эту цитату никуда, но Event Handling Guide for UIKit Apps представляется наиболее актуальным.

+0

спасибо! я посмотрю, как я могу это сделать в своем проекте. в то же время, я повторно отредактирую свой вопрос, чтобы уточнить, что я могу получить это событие, если firstViewController является единственным контроллером представления. – mbotta

Смежные вопросы