Пользовательские UIView и UIViewController лучшие практики? - PullRequest
6 голосов
/ 21 июля 2010

В настоящее время у меня есть простое приложение для iPhone, которое загружает пользовательский подкласс UIView.На данный момент для всего приложения есть только один контроллер, хотя есть несколько UIViews для логического разделения программы.

Моя текущая структура выглядит примерно так:

mainView : UIScrollView
    \__ has one subView : myCustomUIView : UIView
            \__ has many subSubView : myOtherCustomUIView : UIView

Я надеюсь, что этоЧисто;двоеточие, конечно, представляет наследство.

Моя проблема заключается в следующем: мне нужно перехватывать события на самом низком уровне, subSubView.Я могу, вероятно, сделать это в контроллере приложения, если мне нужно, но должен ли я вместо этого иметь subSubViewController?Должен ли я иметь subViewController тоже?

Если так, может кто-то указать мне на некоторые ссылки для этого вручную?Конечно, я могу создавать классы, но соединение их с пользовательскими представлениями кажется нетривиальным.Я не использую конструктор интерфейса вообще, кроме основного пера, в котором находится объект окна.

Мое основное недоразумение возникает из-за того, что произойдет, когда у меня будет представление, вложенное в представление с другим контроллером.Допустим, у меня есть subSubViewController, но mainView все еще имеет mainViewController.Поскольку subSubView содержится в mainView, не вызовет ли это какой-либо проблемы?

И должен ли я вообще использовать делегатов для всего этого?

Любой толчок в правильном направлении приветствуется.

1 Ответ

10 голосов
/ 21 июля 2010

Представления и контроллеры представления существуют в парах. Каждый контроллер представления контролирует представление и подпредставления представления. Это необходимо, потому что контроллеры представления находятся в цепочке респондента для событий. Если в одном представлении активны несколько контроллеров представления, цепочка респондента зашифрована.

Стандартные контроллеры представления не имеют атрибута subController и не понимают, активен ли другой контроллер в той же цепочке. Контроллеры навигации и панели вкладок существуют именно для управления иерархическими контроллерами. Однако они делают это путем замены одной пары view / view-controller на другую. Вы не можете использовать контроллеры навигации или панели вкладок, чтобы предоставить разные контроллеры для подпредставлений.

Таким образом, независимо от того, сколько подпредставлений у вас может быть для любого просмотра, у вас будет только один контроллер на экран.

Возможно, вы захотите пересмотреть свой дизайн. Если для каждого из подпредставлений требуется настраиваемое поведение, возможно, вы захотите переместить их в отдельные представления в иерархии контроллеров, например, в шаблоне проектирования мастер-деталь.

Если вам нужно, чтобы все подпредставления были на одном экране, я бы посоветовал посмотреть, как UITableView и UITableViewController справляются со своими задачами. (Вы можете просто использовать измененный вид таблицы.) Вид таблицы - это вид прокрутки, который содержит несколько подпредставлений для ячеек, заголовков разделов, верхних и нижних колонтитулов. Он управляет этим, улавливая касания из табличного представления и определяя, к какому виду ячейки было произведено касание, а затем предпринимая соответствующие действия.

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

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

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