【问题标题】:Perform Segue with Identifier from ViewDidAppear not working使用 ViewDidAppear 中的标识符执行 Segue 不起作用
【发布时间】:2015-10-25 16:37:57
【问题描述】:

我有一个应用程序的条款和条件页面视图,我试图在应用程序第一次打开时以模态方式显示该页面。我知道 performSegueWithIdentifier 方法在正确的时间被调用,但相应的视图从未加载。 viewDidLoad 将来永远不会调用视图控制器。据我所知,segue 标识符也正确匹配。这会导致出现空白黑屏。

   override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(true)

    print("Here")

    if !defaults.boolForKey("hasLaunchedBefore"){

        defaults.setBool(true, forKey: "hasLaunchedBefore")
        setSettingsForFirstTime()

        self.performSegueWithIdentifier("firstTime", sender: self)

    }

}

突出显示的 ViewController 是 segue 开始的地方,它应该在另一个导航控制器以及因此永远不会加载的条款和条件页面结束。顶部 ViewController 的导航控制器是应用程序的入口点。

【问题讨论】:

  • 你在故事板中有一个奇怪的方案,NavigationController 应该是第一个,对于你的 TableViewController 你需要用 NavigationController 嵌入,然后从 TableView 到下一个 ViewController 进行 segue
  • TableViewController 嵌入在图片中看不到的导航控制器中。条款和条件 ViewController 嵌入在单独的 ViewController 中,因为这允许我在以模态方式呈现视图时为视图提供导航栏。我以前做过,没有问题,我不明白为什么会这样导致问题。

标签: ios swift uiviewcontroller segue viewdidappear


【解决方案1】:

那是因为你在中间有导航控制器 您可以在准备 segue 时跳过它并在启动 segue 之前使视图不可见以显示直接显示到条款和条件视图

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    self.view.hidden = true
}

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(true)

    if !defaults.boolForKey("hasLaunchedBefore"){

        defaults.setBool(true, forKey: "hasLaunchedBefore")
        setSettingsForFirstTime()

        self.performSegueWithIdentifier("firstTime", sender: self)
    }
    else { self.view.hidden = false }
}



override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "Id" {
            if let navVc = segue.destinationViewController is UINavigationController {
                if let contentVc = (self as! UINavigationController).visibleViewController {
                     //do preparation
                }
            } 
        }
   }

【讨论】:

  • 我没有为segue做任何准备,你能详细说明一下吗?
  • 你需要准备segue,如果你不知道怎么做
  • 我之前使用过 prepare for segue 方法,但我认为由于没有信息需要传递给另一个 viewController,所以我不需要这样做。如果我不想传递信息,我还需要做什么吗?
猜你喜欢
  • 2018-09-13
  • 2014-04-23
  • 2017-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多