Я создаю приложение iOS с большим количеством пользовательских представлений, поэтому использование стандартных представлений Cocoa не было вариантом. Затем я решил пойти с Контроллер-координатор/медиатор (изученный в Apress - Pro Objective-C Design Patterns для iOS).Координационный шаблон проектирования контроллера в Cocoa Touch
От делегата, я создаю RootViewController, указывающий на взгляд в моем координирующего управления:
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
coordinatingController = [C6CoordinatingController sharedInstance];
self.window.rootViewController = coordinatingController.activeVC;
[self.window makeKeyAndVisible];
return YES;
Затем в координационном контроллера, у меня есть одноэлементные методы создания:
+ (C6CoordinatingController *) sharedInstance{
if (sharedCoordinator == nil){
C6Log(@"New Shared Coordinator");
sharedCoordinator = [[super allocWithZone:NULL] init];
[sharedCoordinator initialize];
}
else {
C6Log(@"Return Singleton Shared Coordinator");
}
return sharedCoordinator;
}
+ (id) allocWithZone:(NSZone *)zone{
return [self sharedInstance];
}
- (void) initialize{
C6Log(@"");
[self checkDevice];
_mainVC = [C6MainViewController initWithDevice:device];
_activeVC = _mainVC;
[self checkLanguage];
[self chooseFirstView];
}
Я также иметь селектор для выбора первого вида (у меня только два в это время):
-(void) chooseFirstView{
// If a language was not setted, go to language settings view
if (!language) {
C6Log(@"Going to Language Settings");
C6LanguageSettingsViewController *languageVC = [C6LanguageSettingsViewController initWithDevice:device];
[_mainVC.view addSubview:languageVC.view];
}
else {
C6Log(@"Going to User Settings", language);
C6AccountSettingsViewController *accountVC = [C6AccountSettingsViewController initWithDevice:device];
[_mainVC.view addSubview:accountVC.view];
}
}
Тогда у меня есть IBAction для использования моих взглядов:
- (IBAction) requestViewChangeByObject:(id)object {
int buttonTag = [object tag]; // dividend
int viewTag = buttonTag/divisor; // quotient
int actionTag = buttonTag - (divisor * viewTag); // remainder
C6Log(@"viewTag: %d | actionTag %d", viewTag, actionTag);
switch (viewTag) {
case LanguageTags:
C6Log(@"LanguageTags");
break;
case AccountTags:
C6Log(@"AccountTags");
break;
default:
break;
}
В СИБ, я создал Obect (Координационный контроллер) я называю IBAction оттуда. Он работает очень хорошо, и я могу изменить свои взгляды (это все еще необходимо реализовать) .........
НО ... Я также хочу изменить язык, но, поскольку это не проблема навигации, я хочу сделать это из C6LanguageSettingsViewController, а не из C6CoodinatingController.
Итак, я создал еще один IBAction в C6LanguageSettingsViewController:
- (IBAction)chooseLang:(id)sender{
UIImage *bt;
[self resetImagesToNormalState];
C6Log(@"");
C6Log(@"%@", [sender tag]);
C6Log(@"%@", sender);
.
.
.
При подключении кнопки к этой IBAction (через владелец файла или через объект LanguageSettingsViewController), приложение ломает и, иногда он не показывает ошибки и иногда он представляет Непризнанный селектор, отправленный в пример ИЛИ EXC_BAD_ACCESS (код = 1, адрес = 0x .........) в UIApplicationMain.
Я считаю, что проблема заключается в том, что NIB не находит владельца файла ... но я не уверен, как его решить.