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

iOS Swift:使用其他UIViewController启动应用程序的最佳实践,ios,swift,uiviewcontroller,lifecycle,Ios,Swift,Uiviewcontroller,Lifecycle,TLDR版本:我尝试使用Swift通过检查保存对象的方法,在iOS应用程序中将用户推送到特定的UIVIewController。如果我在viewdide中按下VC,则需要几秒钟才能启动。如果我把它放在viewdilayoutsubviews中,它会抛出警告“开始/结束外观转换的调用不平衡。” 我想知道实现这一功能的最佳方式,这样我就有了良好的用户体验,并通过了苹果提交 详细信息:我是一个小班小组的成员,正在使用Swift为iOS开发一个小型软件项目,特别关注使用多点连接框架的小组体验。我们会在应

TLDR版本:我尝试使用Swift通过检查保存对象的方法,在iOS应用程序中将用户推送到特定的
UIVIewController
。如果我在
viewdide
中按下
VC
,则需要几秒钟才能启动。如果我把它放在
viewdilayoutsubviews
中,它会抛出警告“
开始/结束外观转换的调用不平衡。”

我想知道实现这一功能的最佳方式,这样我就有了良好的用户体验,并通过了苹果提交

详细信息:我是一个小班小组的成员,正在使用Swift为iOS开发一个小型软件项目,特别关注使用
多点连接
框架的小组体验。我们会在应用程序启动时检查设备上是否存在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
输入名称并捕获图像

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.")
    })
}
这也适用于显示适当的视图控制器,但计时很棘手

如果我将此方法放入
viewDidLoad
viewwillbeen
,则无法启动。如果我把它放在
viewdide
中,它会在大约两秒钟后出现,这不是一个流畅的用户体验。如果我把它放在
viewdilayoutsubviews
中,我会得到以下警告,我认为这是一个提交失败的案例:

Unbalanced calls to begin/end appearance transitions for <ProjectShare.LaunchViewController: 0x7f85a2e37520>.
开始/结束外观转换的调用不平衡。
如果使用
performsguewithidentifier
方法,我会得到类似的结果

我知道可以在
didFinishLaunchingWithOptions
中从AppDelegate以编程方式选择初始viewController(尽管我不熟悉如何操作),但对于用户与软件的关系中只发生一次的事情来说,这似乎是一个糟糕的架构选择


基本上,我们正在寻求帮助,以一种不是苹果提交失败案例的方式为用户顺利实现这一点。

我没有看到您的故事板,但我建议它有一个
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开始,并在导航栏上单击返回按钮,从而启动VC


注意:如果你的应用程序没有显示导航,你可以隐藏导航

我不太明白你的问题。从AppDelegate中选择初始viewController非常有效。如果我是你,我会走那条路。如果用户的默认值为!=nil,如果不打算使用LaunchViewController,为什么要创建它?LaunchViewController是主视图控制器,它是主菜单控制器,因此用户必须在创建UserInfo对象后才能开始使用应用程序。我在问题中作了澄清。从一位讲师那里得到的建议是,如果初始viewcontroller几乎总是故事板中指定的,那么以编程方式设置它不是最佳实践。这不是一个黑白主题,因为许多程序员不使用故事板。我认为以编程方式进行设置并不坏,因为首先打开AppDelegate来查看应用程序如何启动几乎是很自然的,而不是让您通过故事板名称进行自我引导。谢谢,这似乎是一种合理的方法,也是我第一次打算去的地方,我很欣赏这个观点。我没有意识到导航控制器是可以隐藏的,出于各种原因,我们绝对不想在这个项目中使用导航控制器。我将不得不与团队讨论这一点,我一直专注于项目的数据模型,而较少关注视图控制器,因此我不确定这将如何影响他们的工作。我很感激你的回答。