2012-01-23 5 views
2

Я склонен согласиться с Джо Конвея и анализа Аарон Hillegass, поскольку сегодня сообщил Ole Бегеманн в http://oleb.net/blog/2012/01/initWithNibName-bundle-breaks-encapsulation/initWithNibName UIViewController: причина этого дизайна?

В основном, они утверждают, что имя файла СИБ является деталью реализации соответствующего класса UIViewController, и что это не бизнес вызывающего класса передать имя файла NIB в методе init.

Мне было интересно, была ли какая-либо особая причина для этого выбора дизайна у создателей AppKit/UIKit или если это просто ошибка, и, в последнем случае, почему это не было исправлено, когда вышел UIKit , что было бы хорошей возможностью.

Если какой-либо старинный таймер Objective-C может предоставить исторический фон этому, было бы неплохо лучше понять структуру, которую мы используем каждый день.

+0

btw - если вы передадите 'nil' для имени ниба, контроллер будет загружен из Nib с тем же именем, что и сам класс, если он существует ... – nielsbot

+0

Конечно. Это очень удобно, но в принципе инкапсуляция, по-видимому, по-прежнему нарушается по дизайну. – KPM

ответ

2

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

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

2

Я подозреваю, что это было сделано таким образом, чтобы UIViewController мог иметь базовую функциональность в качестве контроллера, не требуя какого-либо подкласса. Например, если вы просто нажимаете «Credits» на контроллере навигации, и в представлении нет ничего, кроме статического текста, вы можете уйти, не создавая подкласс UIViewController. Вы можете просто создать UIViewController непосредственно и передать ему наконечник, который содержит ваш статический текст.

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

+0

Я об этом подумал. Но, тем не менее, он не отвечает, почему в каждом образце кода Apple и шаблонах Xcode имя NIB указано в вызывающем VC, а не в VC-реализации :) – KPM

+0

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

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