我正在开发一个由多人开发的许多领域的ios应用程序。我们想要一个简单的标准范例来实例化视图控制器(通常来自应用程序的其他区域),例如:
MyViewController *myVC = [[MyViewController alloc] init];
但是,我们希望能够在Storyboards中定义ViewControllers,其中每个区域可能有一个或多个故事板。我们如何才能获得初始化UIViewControllers的代码,而不需要知道故事板的具体内容?
以下情况会怎么样? (在MyViewController.m中)
- (instancetype)init
{
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MyViewControllerStoryboard" bundle:nil];
return [storyboard instantiateViewControllerWithIdentifier:@"MyViewController"];
}
或者上述会导致内存泄漏和/或其他令人讨厌的副作用吗?
答案 0 :(得分:1)
对于视图控制器的每个特殊情况,将具有工厂方法的类别怎么样?
示例:强>
您有MyViewControlle.h
和MyViewController.m
以及MyViewControllerStoryboard.storyboard
。您可以使用以下内容创建MyViewController+FactoryMethods.h
和MyViewController+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文件不受工厂方法的影响。方法非常灵活,因为团队中的任何人都可以使用自定义工厂方法轻松扩展类别。此外,每个人都应该很快习惯于寻找控制器实例化的工厂方法。