我正在开发一款 iOS 应用程序,其中包含由多人开发的多个领域。我们想要一个简单的标准范例来实例化 View Controller (通常来自应用程序的其他区域),例如:
MyViewController *myVC = [[MyViewController alloc] init];
但是,我们希望能够在 Storyboard 中定义我们的 ViewController,其中每个区域都可以有一个或多个 Storyboard。我们怎样才能让初始化 UIViewController 的代码不需要知道 Storyboard的细节?
像下面这样的东西行得通吗? (在 MyViewController.m 中)
- (instancetype)init
{
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MyViewControllerStoryboard" bundle:nil];
return [storyboard instantiateViewControllerWithIdentifier:@"MyViewController"];
}
或者上述会导致内存泄漏和/或其他讨厌的副作用吗?
最佳答案
对于 View Controller 的每个特殊情况,有一个具有工厂方法的类别怎么样?
示例:
您有 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 文件不受工厂方法的影响。而且方法非常灵活,因为团队中的任何人都可以使用自定义工厂方法轻松扩展类别。此外,每个人都应该很快习惯寻找 Controller 实例化的工厂方法。
关于ios - 如何隐藏正在从 Storyboard 中初始化的 ViewController?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24784492/