Почему UIViewController является подклассом UIResponder? - PullRequest
8 голосов
/ 15 мая 2011

Какова цель сделать UIViewController подклассом UIResponder?Было ли это сделано исключительно для передачи событий вращения?

Я не смог найти какой-либо определенной информации об этом в документации.

Обновление

Я понимаю, что если что-то сделаноUIResponder, это что-то должно быть включено в цепочку респондента и обрабатывать события.Но у меня есть два грызущих сомнения.

  1. Насколько я знаю, UIViewController помещается в цепочку респондента сразу после ее view.Зачем нам нужен контроллер представления в цепочке респондента на всех ?Его view уже есть, так почему бы нам не позволить представлению обрабатывать события, которые не были обработаны его подпредставлениями?
  2. Хорошо, я готов согласиться с тем, что нам это может понадобиться.Но я хотел бы увидеть некоторые примеры из реальной жизни, когда обработка событий в контроллере представления действительно необходима и является лучшим / самым простым / наиболее подходящим способом сделать что-то.

Ответы [ 4 ]

13 голосов
/ 16 августа 2012

Я думаю, что вашей проблемой может быть просто отказ объектно-ориентированного мышления.

По документам:

Цепочка респондента представляет собой связанную серию объектов респондента, с которыми сообщение о событии или действии применяется.

В UIKit контроллер представления находится в цепочке респондента между его представлением и представлением, к которому был выдвинут контроллер. Поэтому ему предлагается любое событие или действие, которое его представления не обрабатывают.

Следующим ответчиком самого верхнего контроллера представления является окно, следующим ответчиком окна является приложение, следующим ответчиком приложения является делегат приложения, а делегатом приложения - то, где доллар останавливается.

Ваш вопрос "Было ли это сделано исключительно для прохождения событий вращения?" применяет неправильный тест; это подразумевает, что в какой-то момент цепь ответчика была полностью спроектирована, и кто-то подумал: «О, подожди, а как насчет вращения? Лучше бросить контроллеры вида в цепь ».

Первоначальный вопрос был таков: будет ли полезно, если события или действия могут обрабатываться контроллером представления, если ни одно из представлений не обрабатывает их? Ответ, очевидно, должен быть «да», поскольку - даже на устройстве с сенсорным экраном - будут события или действия, которые по своей природе не связаны с представлением.

Наиболее очевидными примерами являются те, которые связаны с физическими входами, отличными от экрана. Так что вращение устройства одно. Клавиши на клавиатуре Bluetooth - другое. Пульты дистанционного управления являются третьим. Акселерометр четвертый.

Следующим наиболее очевидным примером являются любые сгенерированные системой события или действия, которые должны быть направлены на самого локального субъекта, а не на всех. В iOS обычно запрашивается более конкретный актер, например, самый локальный менеджер отмены или идентификатор представления ввода, чтобы показать, подходит ли вам фокус.

Немного менее очевидный пример - пример UIMenuController - всплывающее представление, которое публикует событие пользовательского ввода, которому может потребоваться пройти через несколько контроллеров представления, чтобы перейти к тому, который должен на него воздействовать. Контроллеры дочернего представления iOS 5 увеличивают количество возможностей здесь; довольно часто у вас будет один родительский контроллер представления с логикой, чтобы делать кучу вещей и потомков, которые хотят передавать сообщения тому, кто знает, как с ними обращаться, без жесткого кодирования иерархии.

Итак, нет, контроллеры представления не были добавлены в цепочку респондента только для обработки событий поворота. Они были добавлены, потому что по логике они принадлежат тому, чтобы быть там, основываясь на первоначальном определении цепочки респондента.

3 голосов
/ 15 мая 2011

Это будет звучать как бойкий ответ, но на самом деле это не так.UIViewController является подклассом UIResponder, поэтому он может реагировать на действия пользователя (например, касания, движения и т. Д.).

Если представление не реагирует на событие, оно передается вверх по цепочка респондента дает возможность объектам более высокого уровня справиться с этим.Следовательно, контроллеры представления и класс приложения являются подклассами UIResponder

Более подробную информацию о цепочке респондентов можно найти в Компетенции приложений какао для iOS: объект респондента на сайте разработчика Apple.

1 голос
/ 15 мая 2011

UIViewController находится в цепочке респондента, чтобы позволить ему обрабатывать любое событие.Есть не только события, о которых вы думаете (затрагивает), которые проходят через эту цепочку.События движения передаются через цепочку, события касания, которые не обрабатываются конкретным представлением, вы также можете проталкивать вещи через цепочку респондента, используя [UIApplication sendEvent:...] с нулевой целью.

Другая вещь, которую вы можете заметить,UIApplication также является подклассом UIResponder.Все события, которые не были обработаны, будут в конечном итоге там.

0 голосов
/ 02 июля 2012

В концепции MVC обработку происходящего события должен выполнять контроллер.

Существует функция, позволяющая установить для «nil» значение «target» параметра - [UIControl addTarget: action: forControlEvents:] в случае, если цепочка респондента ищет объект, желающий ответить на действие.

То есть из-за опции поиска UIViewController является подклассом UIResponder.

Таким образом, вы можете отправлять события настраиваемого управления таким же образом, чтобы воспользоваться преимуществами опции «поиск».

...