iOS swift : Best practices for starting app with an alternative UIViewController

标签 ios swift uiviewcontroller lifecycle

TLDR 版本:我尝试将用户推送到特定的 UIVIewControlleriOS 应用程序中使用 Swift 通过方法检查保存的对象。如果我把推送到 VCViewDidAppear ,需要几秒钟的时间才能开火。如果我把它放在 viewDidLayoutSubviews ,它会抛出警告“Unbalanced calls to begin/end appearance transitions for <ProjectShare.LaunchViewController: 0x7f85a2e37520>."

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

详细信息:我是一个小类(class)小组的一员,致力于使用 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输入名称并捕获图像。

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.")
    })
}

这也适用于它呈现正确的 View Controller ,但时机很棘手。

如果我把这个方法放在 viewDidLoad 中或在 viewWillAppear ,无法点火。如果我把它放在 viewDidAppear ,它会在大约两秒钟后出现,这不是一种流畅的用户体验。如果我把它放在 viewDidLayoutSubviews ,我收到以下警告,我认为这是提交失败的情况:

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

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

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

基本上,寻求帮助使用户顺利完成此操作,并且不会出现苹果提交失败的情况。

最佳答案

我还没有看到你的 Storyboard,但我建议它有一个 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 和其导航中指向 LaunchVC 的“后退”按钮开始。

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

关于iOS swift : Best practices for starting app with an alternative UIViewController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26705840/

相关文章:

ios - 为什么 Xcode 不让 outlets unowned 而不是 weak?

swift - 如何在userdefaults中存储日期?

objective-c - 重用 View Controller

objective-c - NSClassFromString(MyClassName) 比调用 MyClass 的类函数

ios - 单击TableViewCell时如何将数据从NSObject传递到另一个ViewController?

ios - 在 iOS 9 上关闭 viewController 时的延迟

ios - 自定义 View 中的 Crasher 作为 UINavigationControllers navigationItem.titleView

iphone - 如何更改 Controller 中按钮的图像与另一个按钮的图像?

ios - 异步服务调用的 TableView 单元测试

ios - 用彼此不同的随机数填充数组?