相关疑难解决方法(0)

在初始化第一个视图控制器之前运行代码(基于故事板的应用程序)

我的应用程序需要执行一些清理任务 - 删除本地存储的旧数据 - 每次启动时,在显示初始视图控制器之前。

这是因为初始视图控制器在初始化时加载现有数据,并将其显示在表视图中。

我设置了几个断点,并发现初始视图控制器的初始化程序 ( init?(coder aDecoder: NSCoder)) 运行之前 application(_:didFinishLaunchingWithOptions)- 甚至之前application(_:**will**FinishLaunchingWithOptions),准确地说。

我可以将清理代码放在视图控制器初始值设定项的最顶部,但我想将清理逻辑与任何特定屏幕分离。有一天,那个视图控制器可能最终不会成为最初的视图控制器。

覆盖应用程序委托的init()方法并将我的清理代码放在那里确实可以完成工作,但是......

题:

没有更好/更优雅的方式吗?


注:供参考,相关方法的执行顺序如下:

  1. AppDelegate.init()
  2. 视图控制器.init()
  3. AppDelegate.application(_:willFinishLaunchingWithOptions:)
  4. AppDelegate.application(_:didFinishLaunchingWithOptions:)
  5. 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 = …
Run Code Online (Sandbox Code Playgroud)

uiviewcontroller ios uistoryboard appdelegate

5
推荐指数
1
解决办法
2466
查看次数

为什么在 AppKit 中主视图的绘制方法之后调用 applicationDidFinishLaunching

我习惯于applicationDidFinishLaunching在 iOS 中执行应用程序初始化,但在 appKit 中它在主视图的方法之后被调用draw!由于应用程序尚未初始化,因此现在绘制任何内容还为时过早。这是顺序:

  1. viewDidLoad (主视图控制器)
  2. draw(_ dirtyRect:) (主控制器视图)
  3. applicationDidFinishLaunching (为时已晚!)

该API参考说,有关以下applicationDidFinishLaunching

在应用程序的主运行循环启动之后但在处理任何事件之前调用此方法。

因此,应该在之后 发布抽奖事件applicationDidFinishLaunching。我不习惯这种行为——这是怎么回事?

macos xcode appkit

1
推荐指数
1
解决办法
1767
查看次数