performeguewithidentifier 在一个 viewDidLoad 中有效,但在另一个 viewDidLoad 中无效,使用“Show”segues

Posted

技术标签:

【中文标题】performeguewithidentifier 在一个 viewDidLoad 中有效,但在另一个 viewDidLoad 中无效,使用“Show”segues【英文标题】:performseguewithidentifier works in one viewDidLoad but not in another, using "Show" segues 【发布时间】:2016-01-06 15:00:13 【问题描述】:

这是第一个viewDidLoad:

- (void)viewDidLoad 
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    if ([[NSUserDefaults standardUserDefaults] objectForKey:@"Tutorial"]) 
        [self performSegueWithIdentifier:@"fromTutorialToWelcome" sender:self];
    else
        [self setupVc];
    

这是第二个,在以下视图控制器中:

- (void)viewDidLoad 
    [super viewDidLoad];
    if ([[NSUserDefaults standardUserDefaults] objectForKey:@"loginTesting"])  //This evaluates to true, I double and triple checked.

        [self performSegueWithIdentifier:@"fromWelcomeToEntryPoint" sender:self];
    else
        [self setupVc];
    

两个segues都是Show segues,那么为什么第二个不起作用呢?

编辑:强调 segue 的类型,因为这不再是 ios5。

EDIT2:我想我没有正确解释我想要做什么。我希望在不看到第二个视图控制器的情况下显示第三个视图控制器。

【问题讨论】:

会发生什么?你收到什么信息?您是否设置了断点或将日志记录添加到 prepareForSegue 什么都没有发生,应用程序不会移动到任何地方。我刚刚覆盖了 PrepareForSegue,但它只有一个 NSLog 我不认为在 viewDidLoad 中执行 segues 是一个好主意。现在还为时过早 -> ***.com/questions/8221787/… 【参考方案1】:

当您从非运行状态打开应用时,每个视图只会加载到内存中一次。在第二个视图控制器中,将其从 viewDidLoad 移动到 viewDidAppear。我相信它会解决你的问题。如果没有,请告诉我,我会尝试调试它。

编辑:

这是我制作的一个工作示例。

第一次: FirstViewController -> SecondViewController -> ThirdViewController

第二次: FirstViewController -> ThirdViewController(没有看到 SecondViewController!)

FirstViewController.swift:

import UIKit

class FirstViewController: UIViewController 

    override func viewDidLoad() 
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    

    @IBAction func ToSecondPressed(sender: AnyObject) 

        if let skip = NSUserDefaults.standardUserDefaults().valueForKey("SkipSecond") as? Bool

            let Third: ThirdViewController = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle()).instantiateViewControllerWithIdentifier("Third") as! ThirdViewController

            UIApplication.sharedApplication().delegate?.window??.rootViewController = Third
        

        else

            let Second: SecondViewController = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle()).instantiateViewControllerWithIdentifier("Second") as! SecondViewController

            NSUserDefaults.standardUserDefaults().setBool(true, forKey: "SkipSecond")
            UIApplication.sharedApplication().delegate?.window??.rootViewController = Second
        

    


SecondViewController.swift:

import UIKit

class SecondViewController: UIViewController 

    override func viewDidLoad() 
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    

    @IBAction func ToThirdPressed(sender: AnyObject) 
        let Third = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle()).instantiateViewControllerWithIdentifier("Third") as? ThirdViewController

        UIApplication.sharedApplication().delegate?.window??.rootViewController = Third
    



ThirdViewController.swift:

import UIKit

class ThirdViewController: UIViewController 

    override func viewDidLoad() 
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    



【讨论】:

虽然 viewDidLoad 只触发过一次,但这不应该成为问题,因为在第一个 segue 开始之前不会实例化第二个 ViewController。而且,虽然 viewDidAppear 确实解决了导航问题,但我最终看到了第二个视图控制器,我想避免它并跳到我试图到达的第三个视图控制器 @Jargen89 我在答案中添加了工作示例。这里的主要关键是操作应用程序的窗口并根据您想要的viewController(第二或第三)分配它。我不喜欢 segues,更喜欢使用 storyboard 的 instantiateViewController 方法...

以上是关于performeguewithidentifier 在一个 viewDidLoad 中有效,但在另一个 viewDidLoad 中无效,使用“Show”segues的主要内容,如果未能解决你的问题,请参考以下文章

performeguewithidentifier 在一个 viewDidLoad 中有效,但在另一个 viewDidLoad 中无效,使用“Show”segues

使用 iBeacons 执行 eguewithidentifier