使用 ViewDidAppear 中的标识符执行 Segue 不起作用

Posted

技术标签:

【中文标题】使用 ViewDidAppear 中的标识符执行 Segue 不起作用【英文标题】:Perform Segue with Identifier from ViewDidAppear not working 【发布时间】: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 中,因为这允许我在以模态方式呈现视图时为视图提供导航栏。我以前做过,没有问题,我不明白为什么会这样导致问题。 【参考方案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,所以我不需要这样做。如果我不想传递信息,我还需要做什么吗?

以上是关于使用 ViewDidAppear 中的标识符执行 Segue 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

performSegue 动画结束,啥标识符?

Grand Central Dispatch、viewWillAppear、viewDidAppear 执行顺序混乱

动画完成后执行转场

自动布局:ViewDidAppear 中的帧大小不正确

iOS 编程:viewDidAppear 中的自定义按钮

iPhone 5 中的 viewDidAppear 高度为 656