2012-03-01 3 views
3

Я новый разработчик, создающий простое приложение «словаря» для личного использования, и мой вопрос в том, как правильно реализовать дизайн Model-View-Controller в моей конкретной ситуации , Пожалуйста, несите со мной нужную предысторию:Model-View-Controller на практике на iPhone словарь приложение

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

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

Я достиг этого вывода в консоли Xcode 4.3, сохраняя каждый список в NSMutableArray и используя NSDictionary для хранения всех NSArrays. Вот код:

//creates lists 
NSArray *catList = [NSArray arrayWithObjects:@"Lion", @"Snow Leopard", @"Cheetah", nil]; 
NSArray *dogList = [NSArray arrayWithObjects:@"Dachshund", @"Pitt Bull", @"Pug", nil]; 
... 
//creates dictionary and stores lists values with dictionary keys 
NSMutableDictionary *wordDictionary = [[NSMutableDictionary alloc] init]; 
[wordDictionary setObject: catList forKey:@"Cats"]; 
[wordDictionary setObject: dogList forKey:@"Dogs"]; 
... 
//randomizes selection of dictionary key 
NSInteger keyCount = [[wordDictionary allKeys] count]; 
NSInteger randomKeyIndex = arc4random() % keyCount; 
//displays selected key, which is the main word 
NSLog(@"%@", randomKey); 
//selects array list corresponding to key 
NSMutableArray *randomlySelectedArray = [wordDictionary objectForKey:randomKey]; 
//shuffles the output of the selected word list array 
for(int index = 0; index < keyCount; index++) 
      { 
       int randomIndex = arc4random() % keyCount; 
       [randomlySelectedArray exchangeObjectAtIndex:index withObjectAtIndex:randomIndex]; 
      } 
//prints word list and removes displayed dictionary selection 
NSLog(@"%@", randomlySelectedArray); 
[wordDictionary removeObjectForKey:randomKey]; 

(мне нужно добавить код, который делает отображает основное слово и список по одному, может быть, с помощью NSTimer, но это то, что у меня до сих пор.)

Используя шаблон единого вида в Xcode, я смог заставить симулятор показать основное слово и соответствующий список, добавив некоторый код этого метода в IBAction кнопки в файле реализации контроллера представления. (Конечно, я изменил NSLog на initWithFormat.) Однако ни один из моих рандомизационных кодов не работает.

Мой вопрос, наконец, как я могу отделить вещи так, чтобы они лучше соответствовали дизайну MVC? Я думаю, что: Моя кнопка и мои два ярлыка составляют представление. Контроллер моего представления - это контроллер, а мои данные NSArrays и NSDictionary - это Модель.

Тем не менее, я сохраняю все данные моей модели внутри контроллера вида, что, я уверен, ошибочно. Я думаю, что мне нужно выяснить, как создать класс для NSArray и NSDictionary для хранения данных модели. Затем я должен получить ярлыки кнопок &, чтобы отобразить желаемый текст моих данных модели через контроллер моего вида. По крайней мере, я думаю, что так работает MVC.

Мне интересно, правильно ли это понимание, и если у кого есть какие-либо указатели на то, как эффективно организовать мои данные модели, чтобы получить желаемый результат.

Большое спасибо за любую помощь! Я застрял!

ответ

6

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

Почему мы используем MVC (Model-View-Controller) Потому что это помогает нам в:

Разделения мест полномочий также приводит к повторному

Минимизации зависимости, вы можете взять модель или вид класс, который вы уже написали и использовать его в другом месте

подумать о том, чтобы писать меньше кода

При разработке приложения на основе MVC мы должны сосредоточиться на вышеуказанных пунктах. Позволяет связать это приложение «Словарь» с словарем реального мира.

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

Модель Часть:

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

В вашем приложении у вас будет класс: «Словарь», который будет представлять словарь реального мира. Этот словарь состоит из слов, их значения, произношения, использования и другой информации. Итак, нам понадобится массив слов, который будет содержать объект «Word». Класс «Word» будет содержать всю информацию, которую мы хотим предоставить для конкретного слова. Вы также можете указать другие атрибуты, которые вы можете думать о том, что принадлежит к словарю и добавить их к нему. (Здесь мы говорим о содержании только)

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

  1. Мы будем иметь класс DictionaryCreator который добавит все слова, что наш словарь будет иметь. Так что это еще один класс 'DictionaryCreator'. Или мы можем поместить эту логику создания в методы «Словарь» . Но будет полезно иметь этот класс, который будет включать функции добавления словаря в словарях .

  2. После того, как DictionaryCreator создаст словарь, Пользователь будет готов его использовать. Поэтому нам нужно будет предоставить различные операции, которые пользователь может выполнять в «Словаре» в качестве своих методов. В нашем случае мы можем считать, что пользователь находится над контроллером, который фактически контролируется пользователем .

выше techique поможет вам создать компонент, который выполняет только его и ответственный, можно повторно использовать в другом приложении или продлены для использования в будущем. * Всегда помните, что модель является наиболее многоразовым компонентом дизайна MVC. Поэтому всякий раз, когда вы сомневаетесь в модели, просто напомните слова «Модель должна быть повторно использована». (Не известно о просмотрах или контроллерах)

Итак, мы только что закончили модельную часть приложения.

Просмотр Часть:

Это зависит от вас, какой интерфейс вы хотите предоставить пользователю. Но давайте снова рассмотрим словарь реального мира. Содержимое (информация) словаря реального мира распространяется на несколько страниц. Это представление помогает нам просматривать/получать доступ/отмечать/закладок в словаре. (Помните, что здесь пользователь выполняет всю операцию, а не страницы, ни словарь). На страницах есть простое слово для поиска сверху или снизу, а также некоторое произношение в нижней части.

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

Здесь у нас снова есть несколько вариантов реализации этого, вы можете создать представление с помощью Interface Builder и связать их с вашим контроллером. Но опять же этот контроллер и View будут тесно связаны, и когда мы захотим использовать аналогичный интерфейс в другом месте, мы не сможем это сделать. Поэтому для повторного использования мы создадим еще один класс UIView и создадим его с помощью нового View XIB и загрузим этот nib. Поэтому в будущем, если вам нужен аналогичный вид, вы можете легко его использовать (например, какао-touch предоставляет нам UIView, UIButton и т. Д.).

* Просмотр также имеет тенденцию быть многоразовым компонентом в MVC. (Не известно, контроллеров, могут быть в курсе соответствующих объектов модели)

контроллер Часть:

Теперь мы создали вид и модель, но как они будут общаться? Контроллер поможет им в этом. Контроллер:

Knows about model and view objects 
The brains of the operation 
Manages relationships and data flow 
Typically app-specific, so rarely reusable 

* Точки и определение я взял из Стэнфордского университета Лекции [CS193P - Лекция 6 iPhone Разработка приложений Проектирование iPhone приложений Model-View-Controller (и зачем?) View контроллеры]

Update:

Недавно я наткнулся на еще один хороший лекции по MVC. Это объясняет эту концепцию дизайна намного лучше с очень хорошими примерами. Он доступен в iTunes U, или вы можете сразу перейти на первую лекцию от iPad and iPhone Application Development (SD) от Paul Hegarty.

+0

Вау, спасибо, что нашли время, чтобы написать такой тщательный ответ @Ravin! Я очень ценю ваше понимание, и я собираюсь проверить серию лекций, на которые вы ссылались. –

+0

+1 действительно. @Orpheus: не забудьте принять ответ, маловероятно, что вы получите лучший вариант :) –

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

  • Нет связанных вопросов^_^