【问题标题】:Segue to specific view controller using AppDelegate使用 AppDelegate 转到特定的视图控制器
【发布时间】:2017-08-25 19:53:34
【问题描述】:

我有一个包含注册和登录视图控制器的应用程序。一旦用户注册或登录,他们就会被连接到主视图控制器。我已经实现NSUserDefaults 来存储用户登录状态的布尔值,这样当他们重新打开应用程序时,它们会自动连接到主视图控制器,而不必通过登录视图控制器。我正在检查didFinishLaunchingWithOptions 中的用户登录状态,如果NSUserDefaults 中存储的登录状态为真,我会启动到主vc 的segue。

我目前正在使用下面的代码来展示主视图控制器:

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let viewController = storyboard.instantiateViewController(withIdentifier :"Recorder") as! RecordController
let navController = UINavigationController.init(rootViewController: viewController)

if let window = self.window, let rootViewController = window.rootViewController 
{
    var currentController = rootViewController
    while let presentedController = currentController.presentedViewController 
    {
        currentController = presentedController
    }
    currentController.present(navController, animated: true, completion: nil)
}

这样做的问题是我不希望我的主视图控制器成为我的根视图控制器,并且呈现主视图控制器正在创建一些我无法弄清楚的奇怪的垂直间距 - 可能是一些问题导航控制器。

【问题讨论】:

  • @Shades 我尝试了该解决方案。问题是我有一个导航控制器,当我登陆我的主视图控制器时,我的应用程序因为这条线而崩溃 self.navigationController!.navigationBar.barTintColor = UIColor.white
  • 给导航控制器一个storyboard ID并直接实例化它
  • @Shades 也尝试过。我的 IBOutlets 现在在我的主视图控制器中失败了。
  • 我不确定你所说的“我不希望我的主视图控制器成为我的根视图控制器”是什么意思,因为你希望你的导航控制器成为你的根视图控制器?

标签: ios swift


【解决方案1】:

根据澄清,这是我认为您应该做的事情。在干净启动时您应该拥有一个UINavigationController,其中登录视图控制器作为它的根。如果您在登录时启动,请抓住导航控制器并将您的其他视图控制器推入堆栈。从 UIKit 的角度来看,这将有效地与登录后实际跟踪显示转场相同。显示转场是自适应的。如果源在导航控制器中,它们将变成导航 pushes,如果不在导航控制器中,它们将变成 present

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    let loggedIn = true

    if loggedIn, let navigationController = window?.rootViewController as? UINavigationController {

        let newVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "Recorder")

        navigationController.pushViewController(newVC, animated: false)
    } else {
        print("expectation failed")
    }

    return true
}

【讨论】:

  • 我实现了你的方法,但我注意到我的 tableview 被向下推了 64 个像素,这与导航栏的高度相同......你认为通过手动实例化导航控制器有一个额外的正在添加 64 像素?
  • @Brosef 哪个 vc 有表格视图,它是 UITableViewController 还是只是常规视图控制器中的表格视图?
  • 它是在主视图控制器(Recorder)之后的视图控制器。它只是一个放在视图控制器中的UITableView
  • 对不起,我无法在我的简化示例中重现它。很可能,您的一个视图控制器需要关闭“调整滚动视图插图”,它位于 View>Utilities>Show Attributes Inspector
  • 这里有一个线索。在didFinishLaunchingWithOptions 中实例化navigationController 之前,我在主视图控制器中将导航栏的颜色设置为白色,并且从主视图控制器连接到的每个视图控制器都有白色导航栏。现在,我选择的每个视图控制器都有默认的灰色导航栏颜色,即使导航栏在主视图控制器中是白色的..
猜你喜欢
  • 2017-04-11
  • 1970-01-01
  • 1970-01-01
  • 2016-06-11
  • 1970-01-01
  • 2017-10-25
  • 1970-01-01
  • 2012-02-19
  • 2014-05-14
相关资源
最近更新 更多