UIView & UIView Контроллеры описывают модель

Это правильно, когда ViewController создает другой ViewController внутри своих методов (скажем, viewDidLoad или viewWillAppear)?

В моем случае - у меня есть представление A, которое содержит несколько других представлений - B и C, которые сами по себе довольно сложны, поэтому для них были разработаны специальные контроллеры представления vcB и vcC, и эти контроллеры представления создаются внутри контроллера представления vcA представления A.

Это нормально? Что, если, например, vcA устанавливает себя в качестве делегата для vcB. Это означает, что vcB сохранит vcA. В этом случае, чтобы правильно освободить все объекты, нам нужно где-то установить делегат vcB равным nil, но какой хороший момент для этого? viewWillDisappear:, viewDidDisappear: или что-то еще?

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

2 ответа

Решение

Я был свидетелем догматической приверженности идее, что только один контроллер представления должен работать одновременно. Что касается меня, я склоняюсь к использованию более одного контроллера представления одновременно, если это упрощает общий дизайн (уменьшает сложность) и облегчает управление проектами. Как вы можете прочитать в недавнем ответе, который я опубликовал, мне кажется, что Apple продвинулась в том же направлении, предоставив поддержку пользовательских контроллеров представления контента, которые позволяют вам работать с несколькими контроллерами представления одновременно.

Стоит прочитать блог Джоны Уильямс, просто чтобы знать, с чем вам, возможно, придется иметь дело. Но, честно говоря, у меня не было проблем, противоречащих его советам. (Этому посту около года.)

Ключевой список контроллера представления должен содержать методы делегата представления, которым он управляет. Представлению действительно все равно, какой объект действует как его делегат. Таким образом, если вы хотели проект, который более гармоничен с точки зрения одного VC, вы можете поместить методы делегата в подклассный объект NSObject и не называть его контроллером представления. Скорее всего, вам придется создать некоторые методы, которые уже есть в UIViewController. Но тогда вам не нужно называть это контроллером представления. Я, я просто подкласс UIViewCcontroller.

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

Контроллеры навигации и панели вкладок Apple делают это, но они ужасно сложны и нестандартны (вероятно, поэтому вы не можете их подклассить).

Другие вопросы по тегам