2012-01-16 3 views
0

Я исхожу из фона Windows Visual Studio (VS), поэтому я нахожу среду Xcode, ну, слишком сложную из-за отсутствия лучшего описания.Быстрые потери с помощью Views и Controllers

Я планирую приложение, которое потребует 4 просмотров (что я бы назвал окнами в VS). 1) В главном (стартовом) представлении появится панель инструментов внизу, которая откроет любое из трех видов. 2) View A будет иметь панель Nav наверху для «Отмена» и «Готово», которая вернется в Main. 3) View B будет иметь верхнюю панель Nav в верхней части для «Назад», которая вернется к Main 4) В представлении C не будет панели Nav, но вернется в Main с помощью DoubleTap.

Мне очень сложно скомпоновать это вместе без простого примера.

Где я могу найти некоторые ясные объяснения Views vs Controllers, для чего они предназначены и как их использовать, желательно с примерами/учебниками/etc?

Интернет лучше, книги в порядке. Я использую Xcode 4.2, нет раскадровки (для совместимости с ios 4.2).

Спасибо.

+0

Возможный дубликат [Лучшая книга/ресурсы для обучения программированию на iOS?] (Http://stackoverflow.com/questions/3403049/best-book-resources-for-learning-ios-programming) –

+0

Почти (некоторая хорошая информация тоже) - Я не ищу помощь Objective-C. Я ищу документацию о структурах и использовании. Например, почему есть панель Nav и контроллер Nav Bar? Что они делают каждый и зачем вам обоим? Такие вещи ... – wayneh

+0

Ответы на этот вопрос охватывают гораздо больше, чем просто Objective-C. –

ответ

4

Общее отличие между контроллерами представления и представлением - это то, что вы можете понять независимо от Xcode/Cocoa - это шаблон проектирования, называемый MVC (Model, View, Controller).

В MVC, ваша структура приложения делится на 3 слоя:

1) Модель является ваш уровень данных, таких как файлы, базы данных, сетевых сервисов, а также объекты, которые существуют независимо от дисплея, такие как пользователь ,

2) Вид - это то, что вы видите на экране. Представление часто состоит из нескольких подматричек в иерархии, например, окно (которое является типом представления) содержит панель инструментов (другой тип представления) и некоторые кнопки (каждый вид), метки, текстовые поля и т. Д. Это все виды.

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

Таким образом, в основном контроллер преобразует ваши данные модели в правый формат для отображения в ваших представлениях и обрабатывает обратную связь от ваших просмотров (нажатие кнопки, текстовая запись и т. Д.) И соответственно изменяет вашу модель.

В какао каждый контроллер представления владеет основным видом (это свойство «вид»), а также может управлять подвидами этой точки зрения, такими как кнопки, метки и т.д.

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

Так, например, навигатор управляется чем-то, называемым навигационным контроллером. Контроллер навигации фактически управляет стеком диспетчеров представлений, а также сам вид навигационной панели.Когда вы нажимаете или выставляете контроллер вида в стек навигационного контроллера, он обеспечивает отображение вида из текущего контроллера представления и отображение навигационной панели правильного заголовка. Когда вы нажимаете кнопку «Назад» в режиме навигации, навигационный контроллер получает это событие кнопки и выталкивает текущий контроллер представления (и связанный с ним вид) из стека.

Преимущество этого подхода (MVC) заключается в том, что оно значительно сокращает количество подкласса, которое вам нужно сделать. Каждая кнопка на вашем экране, вероятно, всего лишь экземпляр стандартного объекта UIButton. Вам не нужно подклассифицировать каждую кнопку, чтобы изменить ее поведение, потому что кнопка не должна знать ничего о том, что происходит, когда она нажата, а просто делегирует ее нажатию на контроллер вида для управления.

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

Nibs/xibs особенно полезны для этого, потому что они позволяют визуально выкладывать ваши взгляды и визуально связывать их действия (например, краны кнопок) с методами на вашем контроллере просмотра, используя перетаскивание капли. Это экономит ваше заполнение вашего контроллера представлений бессмысленным кодом макета (создайте кнопку с этими координатами и этим цветом и прикрепите ее к этому подзону и т. Д.). К сожалению, новички могут вводить в заблуждение для новых разработчиков, потому что они скрывают многое из того, что происходит за кулисами.

Для многоэкранных приложений iOS предоставляет набор так называемых контейнерных контроллеров, которые являются контроллерами, которые управляют несколькими субконтроллерами. Основными примерами являются UITabBarController и UINavigationController. UITabBarController хорош, если у вас есть несколько экранов, на которые вы хотите вставить вкладку, UINavigationController хорош, если у вас есть иерархия экранов, которые пользователь может перемещать между браузером.

+0

Поскольку вы были достаточно любезны ответить, позвольте мне понять, понимаю ли я концепцию, связанную с моим оригинальным сообщением: 1) У меня есть контроллер Main View (шаблон однострочной страницы Xcode 4.2, без раскадровки), и к этому XIB я добавил панель Nav объект и объект панели инструментов. 2) Я также добавил 3 новых вида через NewFile> UIViewControllerSubclass. 3) К 2 из этих новых представлений XIB (A и B) я добавил объект Nav bar. 4) Теперь мне нужно добавить контроллер Nav в контроллер основного вида XIB и использовать его для перемещения между Main, A и B. Я утверждаю это правильно? Почему нет контроллера панели инструментов? Спасибо. – wayneh

+0

Думаю, вы, возможно, немного ошибались. Опять же, будьте очень осторожны, когда высказываете такие вещи, как «Я добавил три вида, выбрав newFile> UIViewControllerSubclass», потому что вы можете вводить в заблуждение просмотры и просматривать контроллеры или, по крайней мере, путать меня! Вероятно, вам не нужно добавлять navbars к вашим представлениям, так как навигатор управляется навигационным контроллером.Начните с разработки того, что будет с навигацией приложения - будут ли у нее вкладки или будет ли навигация возвращаться и переходить, как браузер? Если у него будут вкладки, запустите новый проект, используя шаблон панели вкладок. Если он имеет обратную/передовую навигацию ... –

+0

... перейдите в свой делегат приложения. В методе appDidFinishLaunching инициализируйте window.rootViewController с помощью UINavigationController вместо viewController. Вы заметите, что метод init UINavigationController принимает аргумент rootViewController. Используйте свой исходный контроллер представления в качестве корневого контроллера для контроллера навигации и сделайте контроллер навигации rootViewController для окна. Вы можете удалить навигационную панель, потому что навигационный контроллер теперь будет автоматически вставлять ее. То же самое касается панели инструментов ... –

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