iOS Swift:使用备用UIViewController启动应用程序的最佳实践

时间:2014-11-02 23:48:25

标签: ios swift uiviewcontroller lifecycle

TLDR版:我尝试使用 Swift 通过方法将用户推送到 iOS 应用中的特定UIVIewController检查已保存的对象。如果我将推送到VC中的ViewDidAppear,则需要几秒钟才能触发。如果我将其放入viewDidLayoutSubviews,则会抛出警告“Unbalanced calls to begin/end appearance transitions for <ProjectShare.LaunchViewController: 0x7f85a2e37520>."

我想了解实现此功能的最佳方式,因此我拥有良好的用户体验并通过Apple提交。

详细信息:我是使用Swift从事iOS小型软件项目的小型小组的成员,专注于使用MultipeerConnectivity框架的小组体验。我们在启动应用程序时检查设备上是否存在UserInfo对象,如果找不到,则我们会将用户推送到屏幕以添加用户名和图像以与其他用户共享。

这方法相对简单。我们通过AppDelegate

检查编码对象
let fileManager = NSFileManager.defaultManager()
if fileManager.fileExistsAtPath(self.documentsPath!) {
  var userForLoad = UserInfo.loadTheObject()
  self.defaultUser = userForLoad as UserInfo!
} else {
  self.defaultUser = nil
}

这很好用,所有的持久性都很好。该应用程序然后转到其初始ViewController,此处称为LaunchViewController:此ViewController是应用程序的主菜单,并且99.9%的时间是最佳起点,并且在创建后立即需要UserInfo对象。如果LaunchViewController发现appDelegate.defaultUser对象 nil ,那么我想强制用户CreateUserViewController输入名称并捕获图像。< / p>

let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
let myUserTest = appDelegate.defaultUser as UserInfo!
if myUserTest == nil {
    let storyboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle())
    let destinationVC = storyboard.instantiateViewControllerWithIdentifier("CREATEUSER_VC") as CreateUserViewController!
    let presentingVC = storyboard.instantiateViewControllerWithIdentifier("LAUNCHVIEW_VC") as LaunchViewController!
    destinationvVC.delegate = self
    self.presentViewController(destinationvVC, animated: false, completion: { () -> Void in
      println("Finished presenting CreateUserViewController.")
    })
}

这也有效,因为它提供了正确的视图控制器,但时机很棘手。

如果我将此方法放在viewDidLoadviewWillAppear中,则无法触发。如果我把它放在viewDidAppear中,它会在大约两秒后出现,这不是一个流畅的用户体验。如果我把它放在viewDidLayoutSubviews中,我会得到以下警告,我认为这是一个提交失败的案例:

Unbalanced calls to begin/end appearance transitions for <ProjectShare.LaunchViewController: 0x7f85a2e37520>.

如果我使用performSegueWithIdentifier方法,我会得到类似的结果。

我知道可以从didFinishLaunchingWithOptions中的AppDelegate以编程方式选择初始viewController(虽然我不熟悉如何做),但这似乎是一个糟糕的架构选择,只发生一次在用户与软件的关系中。

基本上,寻求帮助使用户能够顺利地完成这项工作并且不会以苹果提交方式失败。

1 个答案:

答案 0 :(得分:1)

我还没有看到你的故事板,但我建议它有一个UINavigationController,这样你就可以轻松地将CreateUserVC添加到父级的层次结构中,而不必执行礼物。

我写过这个最小的例子:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    // Override point for customization after application launch.
    self.window = UIWindow(frame: UIScreen.mainScreen().bounds)

    //        var viewController: ViewController = ViewController (nibName:nil,bundle:nil)
    self.navigation = UINavigationController (rootViewController: ViewController())
    self.navigation?.addChildViewController(NewViewController())
    self.window!.rootViewController = self.navigation
    self.window!.makeKeyAndVisible()
    return true
}

当然,在将CreateUserVC添加为childViewController之前,您应该检查UserDefaults。但是如果你确实添加它,应用程序将从显示的CreateUserVC开始,并在其导航上的Back按钮开始,这将导致LaunchVC。

注意:如果您的应用没有显示导航,则可以隐藏导航。