将数据从单元格传递给viewController的错误

时间:2016-09-01 16:48:43

标签: ios swift

我一直试图通过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
}

然后我回来(解雇)并点击另一个类别('咖啡')我看到之前的标题 - '啤酒'而不是咖啡'等等。所以它总是推迟一步。

2 个答案:

答案 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"
        }
    }
}

此外,在您的其他视图控制器中,您对_categoryTitlecategoryTitle的使用很奇怪,因为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"
        }
    }
}