我正在创建一个带有许多自定义视图的 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];
}
我还有一个选择器来选择第一个视图(我目前只有两个):
-(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>
但是……我也想改变语言,但是,因为这不是导航问题,我想从 C6LanguageSettingsViewController 而不是从 C6CoodinatingController 来做。
所以,我在 C6LanguageSettingsViewController 中创建了另一个 IBAction:
- (IBAction)chooseLang:(id)sender{
UIImage *bt;
[self resetImagesToNormalState];
C6Log(@"");
C6Log(@"%@", [sender tag]);
C6Log(@"%@", sender);
.
.
.
当我将按钮连接到此 IBAction(通过文件的所有者或通过 LanguageSettingsViewController 对象)时,应用程序中断,有时它没有显示错误,有时它显示发送到实例或EXC_BAD_ACCESS 的无法识别的选择器(代码 = 1,地址 = 0x ... ……)在 UIApplicationMain 中。
我相信问题是NIB没有找到文件的所有者......但我不知道如何解决它。