我一直试图通过segue将一个标题(String)从一个单元格传递给另一个控制器,实际上它可以工作,但是一个行为是完全错误的。
主控制器
var cellTitlePressed:String?
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
cellTitlePressed = categories[indexPath.row].title
performSegue(withIdentifier: "toCategory", sender: self)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let destination = segue.destination as? CategoryVC {
if let title = cellTitlePressed {
destination.categoryTitle = title
} else {
destination.categoryTitle = "Undefined category"
}
}
}
如果我点击一个单元格(比如啤酒'类别),我会看到"未定义的类别"标题,所以我想这个条件第一次不起作用。
目标控制器
private var _categoryTitle: String!
var categoryTitle:String {
get {
return _categoryTitle
}
set {
_categoryTitle = newValue
}
}
@IBOutlet weak var categoryTitleLabel: UILabel!
@IBAction func backButtonPressed(_ sender: AnyObject) {
dismiss(animated: true, completion: nil)
}
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
categoryTitleLabel.text = categoryTitle
}
然后我回来(解雇)并点击另一个类别('咖啡')我看到之前的标题 - '啤酒'而不是咖啡'等等。所以它总是推迟一步。
答案 0 :(得分:0)
我一直试图通过segue
将标题(String)从一个单元格传递给另一个控制器
很好,但随后删除此代码:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
cellTitlePressed = categories[indexPath.row].title
performSegue(withIdentifier: "toCategory", sender: self)
}
您正在执行两次segue:一次因为在故事板中触发了segue,并且再次因为您在代码中触发了它。相反,只需让故事板触发它,然后在cellTitlePressed
中设置performSegue
以及其他代码。
另外,我不太明白为什么cellTitlePressed
需要成为属性。只需将其用作局部变量即可将标题传递给下一个视图控制器。所以这就是你所需要的:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let destination = segue.destination as? CategoryVC {
let cellTitlePressed = categories[indexPath.row].title
if let title = cellTitlePressed {
destination.categoryTitle = title
} else {
destination.categoryTitle = "Undefined category"
}
}
}
此外,在您的其他视图控制器中,您对_categoryTitle
和categoryTitle
的使用很奇怪,因为categoryTitle
除了充当_categoryTitle
的前端之外什么都不做。另外,只要您 这样做,我建议使用它来更新界面,以便事件的顺序无关紧要:
var categoryTitle:String {
get {
return _categoryTitle
}
set {
_categoryTitle = newValue
if categoryTitleLabel != nil {
categoryTitleLabel.title = _categoryTitle
}
}
}
但就个人而言,我会消除_categoryTitle
并使用setter观察者:
var categoryTitle:String = "" {
didSet {
if categoryTitleLabel != nil {
categoryTitleLabel.title = categoryTitle
}
}
}
答案 1 :(得分:0)
固定
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let destination = segue.destination as? CategoryVC {
let currentCell = tableView.indexPathForSelectedRow?.row
if currentCell != nil {
destination.categoryTitle = categories[currentCell!].title
} else {
destination.categoryTitle = "Undefined category"
}
}
}