Nic*_*ari 5 uiviewcontroller ios uistoryboard appdelegate
我的应用程序需要执行一些清理任务 - 删除本地存储的旧数据 - 每次启动时,在显示初始视图控制器之前。
这是因为初始视图控制器在初始化时加载现有数据,并将其显示在表视图中。
我设置了几个断点,并发现初始视图控制器的初始化程序 ( init?(coder aDecoder: NSCoder)) 运行之前 application(_:didFinishLaunchingWithOptions)- 甚至之前application(_:**will**FinishLaunchingWithOptions),准确地说。
我可以将清理代码放在视图控制器初始值设定项的最顶部,但我想将清理逻辑与任何特定屏幕分离。有一天,那个视图控制器可能最终不会成为最初的视图控制器。
覆盖应用程序委托的init()方法并将我的清理代码放在那里确实可以完成工作,但是......
没有更好/更优雅的方式吗?
注:供参考,相关方法的执行顺序如下:
- AppDelegate.init()
- 视图控制器.init()
- AppDelegate.application(_:willFinishLaunchingWithOptions:)
- AppDelegate.application(_:didFinishLaunchingWithOptions:)
- ViewController.viewDidLoad()
清理任务不冗长,也不需要异步运行:相反,我宁愿如果我的初始视图控制器甚至没有实例化,直到它完成(我很清楚,如果它需要的系统会杀了我的应用程序启动时间很长。但是,它只是删除了一些本地文件,没什么大不了的。)。
我问这个问题主要是因为,在故事板出现之前,应用程序启动代码如下所示:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
self.window.backgroundColor = [UIColor whiteColor];
// INITIAL VIEW CONTROLLER GETS INSTANTIATED HERE
// (NOT BEFORE):
MyViewController* controller = [[MyViewController alloc] init];
self.window.rootViewController = controller;
[self.window makeKeyAndVisible];
return YES;
}
Run Code Online (Sandbox Code Playgroud)
...但现在,因为主故事板加载发生在幕后,视图控制器在任何应用程序委托方法运行之前被初始化。
我不是在寻找需要向我的初始视图控制器添加自定义代码的解决方案。
我不确定是否有更优雅的方式,但肯定还有其他一些方式......
我更喜欢我的初始视图控制器在完成之前甚至没有实例化
这不是问题。您所要做的就是从 中删除一个UIMainStoryboardFile或NSMainNibFile键,Info.plist它告诉UIApplicationMain应该加载什么 UI。随后,您在 中运行“清理逻辑”,AppDelegate完成后您自己启动 UI,如示例中所示。
替代解决方案是UIApplicationMain在加载 UI 之前创建一个子类并在其中运行清理。
请参阅下面的应用程序生命周期:
| 归档时间: |
|
| 查看次数: |
2466 次 |
| 最近记录: |