Model-View-Controller на практике в приложении для словаря iPhone - PullRequest
3 голосов
/ 01 марта 2012

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

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

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

Я добился этого вывода в консоли 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 - это Модель.

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

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

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

1 Ответ

6 голосов
/ 01 марта 2012

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

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

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

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

Подумайте, как написать меньше кода

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

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

Часть модели:

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

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

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

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

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

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

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

Просмотр части:

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

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

Здесь у нас снова есть несколько вариантов реализации, вы можете создать представление с помощью Interface Builder и соединить их с вашим контроллером. Но опять же, этот контроллер и View будут тесно связаны, и когда мы захотим использовать подобный интерфейс где-то еще, мы не сможем это сделать. Поэтому для повторного использования мы создадим другой класс UIView и создадим его с новым View XIB и загрузим этот кончик. Так что в будущем, если вам потребуется подобный вид, вы можете легко использовать его повторно (например, Cocoa-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 Модель-представление-контроллер (почему и как?) View Controllers]

Обновление:

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

...