我希望我的应用程序可以“自动”从ViewControll A到b,以及b到c(a,b,c是独立的viewcontroller)进行选择,所以我做到了:
在A_ViewController上定义了一个计时器,可以每隔一分钟从A到B到C进行计时。
在故事板上设置ViewController A和B的位置:
A_ViewController:'goToB'和'goToC'
B_ViewController:'goToC'
,并在A_ViewController中覆盖“覆盖func prepare(for segue:.....”)。
代码:
class A_ViewController: ViewController {
...//in Timer
//first 1 minute
performSegueWithIdentifier("goToB", sender: self)
//second minute
B_Controller(). goToC()
...
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "goToB" {
let B_Controller = segue.destination as! B_ViewController
B_ViewController.msg = "From AtoB"
}
if segue.identifier == "goToSearchLocation" {
let C_ViewController = segue.destination as! C_ViewController
C_ViewController.msg = searchWord
}
}
class B_Controller: ViewController {
...
func goToC() {
performSegueWithIdentifier("goToC", sender: self)
}
}
运行APP后,可以先进行设置(成功显示ViewController B),但是此后,它始终显示错误消息,如下所示:
由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'接收器()没有标识为'goToC'的序列
但是我真的在storyBoard上设置了一个segue“ goToC”。我不知道如何解决。我已经从Google搜索中修改了代码。
答案 0 :(得分:0)
您说B_Controller().goToC()
是创建B_Controller
的新实例,不是指goToB
创建的现有实例。塞古。此外,由于不是从情节提要中创建新的B_Controller
实例,因此它对segues一无所知。
您需要存储对要在属性中显示的B_Controller
实例的引用。然后,您可以使用该属性来调用goToC
函数。
class A_ViewController: ViewController {
var bController: B_Controller?
...//in Timer
//first 1 minute
performSegueWithIdentifier("goToB", sender: self)
//second minute
self.bController?.goToC()
...
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "goToB" {
self.bController = segue.destination as! B_ViewController
self.bController.msg = "From AtoB"
}
if segue.identifier == "goToSearchLocation" {
let C_ViewController = segue.destination as! C_ViewController
C_ViewController.msg = searchWord
}
}
class B_Controller: ViewController {
...
func goToC() {
performSegueWithIdentifier("goToC", sender: self)
}
}
您可能想重新设计代码;在B中使用一个表示C的新计时器而不是在A中使用一个计时器,可能会更清洁。