В статье ваша рекомендация хорошая - как и вы. Мне нравится вводить модель в контроллер (старая привычка от Smalltalk дней - в частности, Dolphin Smalltalk следует этому шаблону довольно широко).
Я обнаружил, что большинство моих контролеров инициализации методы, такие как следующие:
- (id)initWithItem:(id<Nameable>)item addingTo: (id<ModelContainer>)model {
if (self = [self initWithNibName:@"ItemEditTableToolbarView" bundle:nil]) {
self.namedItem = item;
self.container = model;
}
return self;
}
Вы можете назвать ваш контроллер, как это:
ReDoListEditController *itemViewController = [[ReDoListEditController alloc] initWithItem: item addingTo: model];
[self.navigationController pushViewController: itemViewController animated: YES];
[itemViewController release];
Обратите внимание, что я вставлять имя моего Nib-файл в методе init (вы можете сделать этот другой параметр, если вам нужна большая гибкость, но я еще не нашел, что какой-либо из моих контроллеров должен быть общим. Это интересно - как в Dolphin, контроллеры (и их представления) могут быть очень композиционным - так часто в вашем методе init, yo u выберет подмодели из вашей модели и вызовет init для ваших подкомпонентов. Я думаю, что это возможно на iPhone с IB, но я еще не изучил эту идею.
Однако вам нужно сделать немного дополнительной работы, чтобы передать вашу модель первому контроллеру (это было то, что я изначально не выяснил).
- Создать приложение оконного Based в XCode (если вы хотите приложение на основе навигации, вы можете добавить это с кодом довольно легко)
Edit «YourAppDelegate.m» и изменить applicationDidFinishLaunching: метод чем-то вроде следующий:
viewController = [[AppRootViewController alloc] initWithModel: [модель приложения]]; viewController.view.frame = [[UIScreen mainScreen] applicationFrame];
[window addSubview: viewController.Посмотреть];
[window makeKeyAndVisible];
Если вы хотите использовать другой тип проекта, следующие инструкции также, кажется, работает, но его намного больше усилий (я упростил к вышесказанному):
- Удалить файл MainWindow.xib (звучит радикальным, но вы хотите создать MainWindow себя - вы можете создать все другие представления с IB)
- Редактировать свой .plist файл и удалите запись MainWindow.xib (его обычно последний пункт)
Редактировать файл main.m и изменить UIApplicationMain строку (заменив последний параметр с именем существующего приложения делегата) - например .:
INT RetVal = UIApplicationMain (ARGC, ARGV, ноль, @ "YourAppDelegate");
Edit "YourAppDelegate.m" и изменить applicationDidFinishLaunching: метод что-то вроде следующего:
окна = [[UIWindow Alloc] initWithFrame: [[UIScreen В начале] граница]];
viewController = [[AppRootViewController alloc] initWithModel: [модель приложения]]; viewController.view.frame = [[UIScreen mainScreen] applicationFrame];
[window addSubview: viewController.view];
[window makeKeyAndVisible];
Я добавил метод категории для UIApplication называется:
- (MyModel *)model;
Вы можете получить модель из приложения (как я показываю выше), а также в других местах в вашем приложении, например,
viewModel = [[UIApplication sharedApplication] model];
Хотя, если вы всегда передаете его в свой контроллер, как я описал, это, вероятно, запах кода.
Как добавить делегат между контроллерами XIB и объектами модели? Как я могу получить ссылку на экземпляр объекта контроллера? –