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