我正在学习如何在按下按钮时在控制器之间传递数据,所以我正在按照这个答案:Pass data through segue,但我无法使它工作,我有3个按钮,我想要知道按下了哪个按钮,所以我在HomeView中的代码是:
var buttonPressed: String?
@IBAction func newsTapped(_ sender: Any) {
buttonPressed = "news"
self.performSegue(withIdentifier: "showNext", sender: buttonPressed)
}
@IBAction func tipsTapped(_ sender: Any) {
buttonPressed = "tips"
self.performSegue(withIdentifier: "showNext", sender: buttonPressed)
}
@IBAction func otherTapped(_ sender: Any) {
buttonPressed = "other"
self.performSegue(withIdentifier: "showNext", sender: buttonPressed)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let data = buttonPressed
if let destinationViewController = segue.destination as? TableViewController {
destinationViewController.origin = data
}
destinationView(TableViewController)中的代码是:
var origin: String?
override func viewDidLoad() {
if let dataRecived = origin
switch dataRecived {
case "news":
print("News")
case "tips":
print("Tips")
case "other":
print("Other")
}
}
当我单击任何按钮时,它会将我带到TableViewController,但不会打印任何内容,我添加了If let,因为它在语句为if let dataRecived = origin
时崩溃了,现在它永远不会进入if let语句。如果我显示变量的内容(鼠标悬停在xCode中的变量),则会显示:""
为什么它不起作用的任何想法?不确定它是否有事可做,但HomeView是一个ViewController,链接到一个带有TableView的导航控制器(这是一个destinationView。感谢您的帮助
答案 0 :(得分:1)
看起来你的行为不正确,因为你正在viewDidLoad
函数中运行switch语句,该语句在前一个视图控制器的数据被发送之前发生。
尝试向didSet
属性添加origin
方法以加载如下页面:
class tableVC {
var origin: String? {
didSet {
if let dataRecived = origin
switch dataRecived {
case "news":
print("News")
case "tips":
print("Tips")
case "other":
print("Other")
}
}
}
override func viewDidLoad() {
super.viewDidLoad()
}
}
或者您可以在viewWillAppear
方法
答案 1 :(得分:0)
我认为你遇到的问题是:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let data = buttonPressed
if let destinationViewController = segue.destination as? TableViewController {
destinationViewController.origin = data
}
如果您已经为UITableViewCotroller创建了子类,则必须将目标View Controller强制转换为该类
`destinationViewController为? myCustomTableViewController:
if let destinationViewController = segue.destination as? myCustomTableViewController {
destinationViewController.origin = data
}