多くのカスタム ビューを使用して iOS アプリケーションを作成しているため、デフォルトの Cocoa ビューを使用することはできませんでした。次に、Coordinating / Mediator Controllerデザイン パターン (Apress - Pro Objective-C Design Patterns for iOS で学習) を使用することにしました。
デリゲートから、調整コントローラーのビューを指す 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];
}
最初のビューを選択するセレクターもあります (現時点では 2 つしかありません)。
-(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;
}
NIB で Obect (調整コントローラー) を作成し、そこから IBAction を呼び出します。問題なく動作し、ビューを変更できます (まだ実装する必要があります)………</p>
しかし… 言語も変更したいのですが、ナビゲーションの問題ではないので、C6CoodinatingController からではなく、C6LanguageSettingsViewController から変更したいと考えています。
そこで、C6LanguageSettingsViewController に別の IBAction を作成しました。
- (IBAction)chooseLang:(id)sender{
UIImage *bt;
[self resetImagesToNormalState];
C6Log(@"");
C6Log(@"%@", [sender tag]);
C6Log(@"%@", sender);
.
.
.
ボタンをこの IBAction に接続すると (File's Owner または LanguageSettingsViewController オブジェクトを介して)、アプリが中断し、エラーが表示されない場合もあれば、認識されないセレクターがインスタンスに送信された、またはEXC_BAD_ACCESS (コード = 1、アドレス = 0x…)と表示される場合もあります。 ……) UIApplicationMain で。
問題は、NIB がファイルの所有者を見つけられないことだと思いますが、解決方法がわかりません。