如何隐藏从Storyboard初始化ViewController?

时间:2014-07-16 15:17:35

标签: ios objective-c uiviewcontroller uistoryboard

我正在开发一个由多人开发的许多领域的ios应用程序。我们想要一个简单的标准范例来实例化视图控制器(通常来自应用程序的其他区域),例如:

MyViewController *myVC = [[MyViewController alloc] init];

但是,我们希望能够在Storyboards中定义ViewControllers,其中每个区域可能有一个或多个故事板。我们如何才能获得初始化UIViewControllers的代码,而不需要知道故事板的具体内容?

以下情况会怎么样? (在MyViewController.m中)

- (instancetype)init
{
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MyViewControllerStoryboard" bundle:nil];
    return [storyboard instantiateViewControllerWithIdentifier:@"MyViewController"];
}

或者上述会导致内存泄漏和/或其他令人讨厌的副作用吗?

1 个答案:

答案 0 :(得分:1)

对于视图控制器的每个特殊情况,将具有工厂方法的类别怎么样?

示例:

您有MyViewControlle.hMyViewController.m以及MyViewControllerStoryboard.storyboard。您可以使用以下内容创建MyViewController+FactoryMethods.hMyViewController+FactoryMethods.m个文件:

<强> MyViewController + FactoryMethods.h

@interface MyViewController (FactoryMethods)

+ (instancetype)createDefaultViewController();

@end

<强> MyViewController + FactoryMethods.m

#import "MyViewController+FactoryMethods.h"
@implementatiion MyViewController (FactoryMethods)

+ (instancetype)createDefaultViewController() {
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MyViewControllerStoryboard" bundle:nil];
    return [storyboard instantiateViewControllerWithIdentifier:@"MyViewController"];
}

@end

<强>用法:

#import "MyViewController+FactoryMethods.h"

@implementation SomeClass

- (void)method {
    MyViewController *mvc = [MyViewController createDefaultViewController];
}

@end

使用这种方法,您可以保持MyViewController文件不受工厂方法的影响。方法非常灵活,因为团队中的任何人都可以使用自定义工厂方法轻松扩展类别。此外,每个人都应该很快习惯于寻找控制器实例化的工厂方法。