как создать первый подвид - PullRequest
0 голосов
/ 10 ноября 2009

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

- (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];

}

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

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

спасибо,

mbotta

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

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

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

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

однако firstViewController не реагирует на любые колебания. я разбросал несколько NSLogs и обнаружил, что хотя мы действительно говорим firstViewController в canBecomeFirstResponder, чтобы он возвращал YES, и в то время как мы действительно сообщаем ему [self становитьсяFirstResponder] в viewDidAppear, в действительности это , а не firstResponder.

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

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

спасибо,

mbotta

1 Ответ

1 голос
/ 10 ноября 2009

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

Из Рекомендации по обработке событий (выделено мной):

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

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

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

EDIT

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...