макет iOS; Я не понимаю - PullRequest
       3

макет iOS; Я не понимаю

5 голосов
/ 13 января 2011

Ну, "не получить это" слишком резко;У меня это работает, потому что для меня это логическая установка, но это не похоже на то, что iOS считает логичным.Так что я ничего не получаю.

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

МастерMVC знает, как / где он хочет расположить два подчиненных MVC.Каждая деталь MVC заботится только о своих собственных детях в пределах, указанных мастером MVC.Что-то вроде:

- (void)loadView {
    MVC* mvc1 = [[MVC1 alloc] initwithFrame:...]
    [self.view addSubview:mvc1.view];

    MVC* mvc2 = [[MVC2 alloc] initwithFrame:...]
    [self.view addSubview:mvc2.view];
}

Если вышеприведенное логично (что для меня), то я ожидаю, что любой класс MVC будет иметь конструктор "initWithFrame".Но MVC этого не делает, только мнение имеет это.

Почему?

Как правильно расположить вложенные MVC?(Естественно, у меня нет только этих двух, но у подробных MVC снова есть подчиненные MVC.)


Спасибо всем за ответ.Я буду изучать ссылки, которые были предоставлены.

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

Да, я называю UIViewController «MVC», поскольку он для меня в настоящий момент реализует все аспекты MVC;он имеет код контроллера и встроенное представление, плюс контроллер обычно также хранит и предоставляет данные (все примеры TableView реализуют его так).

MVC может присутствовать на многих уровнях;в основном UITextField может (должен?) быть MVC;есть представление, но также задействована логика контроллера, которую вы не хотите смешивать с другим кодом.Инкапсуляция.Например: Java Swing JTextField имеет MVC.Так же, как и JTable, JList, ... Несколько шаблонов MVC, вложенных в другие MVC для построения целого экрана.

Это то, что я ожидаю, когда какая-то платформа говорит, что использует шаблон MVC.Поэтому, когда я закодировал таблицу, я создал MVC и отправляю только сообщение loadData с датой в качестве параметра.Надо позаботиться обо всем остальном.У меня есть деталь MVC, которая может скользить;Затем я говорю ему объект, который он должен показать, и он должен заботиться обо всем остальном.Инкапсуляция.

Итак, у меня много UIViewControllers со встроенными UIViews.И это не способ сделать это ...

Ответы [ 4 ]

8 голосов
/ 14 января 2011

Еще одна потенциальная ссылка - это отличный доклад WWDC 2010 о MVC.

http://developer.apple.com/videos/wwdc/2010/

Это сессия 116 - Model-View-Controllr для iPhone OS

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

Если я понимаю ваше предложение о классах Java Swing выше, вы говорите об анонимных классах, которые отвечают на события?Если это так, то это не «MVC», это то, что называется «Наблюдатели», когда они наблюдают событие с точки зрения того, что они предпринимают какое-то действие (обычно отправляют сообщение контроллеру).Cocoa Touch использует парадигму Target / Action (и делегирование) для достижения этой цели.

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

Я действительно думаю, что доклад WWDC 2010 поможет.

Удачи!

3 голосов
/ 13 января 2011

Если я понимаю ваш вопрос - а я не могу увидеть мои комментарии к нему - я думаю, что вы применяете шаблон проектирования MVC слишком детально. Чаще всего в описываемой вами конфигурации вы будете иметь одну модель, один контроллер и несколько представлений, которые сгруппированы / объединены, как в файле .xib.

В терминах Cocoa Touch у вас будет один UIView, который содержит UILabel с датой и UITableView для вашей таблицы. Это ваши взгляды.

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

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

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

0 голосов
/ 14 января 2011

Спасибо за ссылки, посмотрю их.

Пока что я переписал большую часть своего приложения для использования представлений вместо viewcontrollers (кроме верхнего уровня), и оно начинает совпадать с вызовами API, которые доступны как layoutSubviews. Что меня беспокоит, что мне нужно сделать это сейчас:

[tableDataSource loadData:date];
[tableView reloadData];

Где в моей предыдущей настройке все, что я делал, было:

[tableViewController loadData:date];

Но, видимо, это способ сделать это. Одна вещь мне непонятна, банкомат. Так как я создаю и размечаю представление в loadView в моем AppViewController, как они ретранслируются, если ориентация меняется. VC не имеет layoutSubviews, поэтому я должен использовать didRotateFromInterfaceOrientation и изменить положение подпредставлений оттуда?

Кстати, я не смешиваю регистрацию анонимных внутренних классов в качестве слушателей (наблюдателей). У меня большой опыт написания компонентов Swing и элементов управления JavaFX. И это, вероятно, виновник, в Java (FX) каждый компонент имеет представление и контроллер (не всегда модель).

0 голосов
/ 14 января 2011

Tbee,

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

@interface MyView : UIView

@property (retain) IBOutlet UIButton *button1;
@property (retain) IBOutlet UIButton *button2;

@property (assign) bool myData;

-(IBAction) doButton1:(id)sender;
-(IBAction) doButton2:(id)sender;

@end;

@implementation MyView

@synthesize button1 = _button1;
@synthesize button2 = _button2;
@synthesize myData = _myData;

// I'm leaving out the initWithNib, viewDidLoad, etc.

- (IBAction) doButton1:(id)sender
{
  // do something as a result of clicking button1
  _myData = YES;
}

- (IBAction) doButton2:(id)sender
{
  // do something as a result of clicking button2
  _myData = NO;
}

@end

Подключите их в InterfaceBuilder, и вы получите работающий "MVC". Вам не нужен совершенно новый UIViewController для каждой кнопки. Об этом позаботится тот, кто для View.

UITableView и связанные с ним представления являются более сложными, и может потребовать дополнительный UIViewController для инкапсуляции. Я действительно не рекомендую начинать с их использования, но это хороший урок здесь. В нем много изображений , которые покажут вам, как соединить вещи в IB и подобное, аналогичное, похожее. Он старый, поэтому ваш XCode может не выглядеть как изображения, но это помогает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...