长话短说,我的segue无法执行到我已创建的下一个控制器。很多帮助将不胜感激。
override func viewDidLoad() {
super.viewDidLoad()
var returnValue: Int = UserDefaults.standard.integer(forKey: "quiz1Validation")
if (returnValue == 1)
{
performSegue(withIdentifier: "completed", sender: self)
}
else {
var returnValue: Int = UserDefaults.standard.integer(forKey: "userScore")
scorelabel.text = "Score:\(returnValue)"
RandomQuestions()
}
}
答案 0 :(得分:5)
您无法从viewDidLoad调用performSeugue。你必须从viewDidAppear调用它。
答案 1 :(得分:0)
建议不要在viewDidLoad上执行segue,因为你的viewController还没有在堆栈中。
作为解决方法你可以尝试这个,但我会改变逻辑不使用它:
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
performSegue(withIdentifier: "completed", sender: self)
}
答案 2 :(得分:0)
我认为@Kinja很可能试图通过在viewDidLoad方法本身中调用performSegue来基于特定状态(在用户默认值中存档)跳过特定的视图控制器。
所以我建议尝试以下方法而不是执行performSegue -
希望这会有所帮助。
我制作了一个示例代码来演示相同的@
git clone https://shreekara@bitbucket.org/shreekara/viewcontrollers.git
检查2个视图控制器是如何直接填充的
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let viewcontroller2 = storyboard.instantiateViewController(withIdentifier: "view2")
self.navigationController?.pushViewController(viewcontroller2, animated:false)
let viewcontroller3 = storyboard.instantiateViewController(withIdentifier: "view3")
self.navigationController?.pushViewController(viewcontroller3, animated:false)
答案 3 :(得分:0)
我似乎被迫处理这个问题的方法是创建一个@objc选择器,然后使用perform()从viewDidLoad()调用它。似乎只适用于" afterDelay"版本:
@objc func showCompleted() {
self.performSegue(withIdentifier: "completed", sender: self)
}
override func viewDidLoad() {
super.viewDidLoad()
var returnValue: Int = UserDefaults.standard.integer(forKey: "quiz1Validation")
if returnValue == 1 {
self.perform(#selector(self.showCompleted), with: nil, afterDelay: 0)
}
else {
// ...the rest of your code
}
}
看起来像是对我的黑客攻击,所以我很想听听是否有其他人在更多" Swifty"方式。