从另一个 TableView 添加行 - Swift
Add row from another TableView - Swift
我正在努力做到这一点,以便当我在 listtableviewcontroller 上单击我的数组中的一项时,它会将此选择传递给 dataaddedtableviewcontroller 并附加该选择,以便我可以继续添加到列表中。 Storyboard
我尝试使用协议和委托来传递数据,但是传递的只是整个列表本身(我认为这主要是因为我使用了按钮而不是单击单元格,因为我没有否则知道该怎么做)。我也尝试过使用 segues 传递数据,但是我似乎无法在单击单元格后附加数据。
如有任何帮助,我们将不胜感激。非常感谢!
第一视图控制器:
protocol ListTableViewControllerDelegate {
func addNew(todo: String)
}
class ListTableViewController: UITableViewController {
var delegate: ListTableViewControllerDelegate?
var list = ["chicken", "phone", "water"]
@IBAction func saveToList(_ sender: Any) {
delegate?.addNew(todo: "\(list)")
navigationController?.popToRootViewController(animated: true)
}
override func viewDidLoad() {
super.viewDidLoad()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete implementation, return the number of rows
return list.count
}
}
第二个视图控制器:
class DataAddedTableViewController: UITableViewController, ListTableViewControllerDelegate {
var dataAdded = [String]()
func addNew(todo: String) {
dataAdded.append(todo)
tableView.reloadData()
}
override func viewDidLoad() {
super.viewDidLoad()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete implementation, return the number of rows
return dataAdded.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
cell.textLabel?.text = dataAdded[indexPath.row]
return cell
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let destVC = segue.destination as? ListTableViewController {
destVC.delegate = self as ListTableViewControllerDelegate
}
}
}
您需要找出用户点击的列表项的索引。目前你只是通过了整个列表。此行需要调整:
之前:
@IBAction func saveToList(_ sender: Any) {
delegate?.addNew(todo: list)
navigationController?.popToRootViewController(animated: true)
}
之后:
@IBAction func saveToList(_ sender: Any) {
let index = CODE_NEEDE_HERE //figure out how to find out the index of the list
delegate?.addNew(todo: list[index])
navigationController?.popToRootViewController(animated: true)
}
我猜你有正当理由不使用委托方法 tableView(_:didSelectRowAt:)?
使用 tableView(_:didSelectRowAt:)
解决方案可能是这样的:
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let item = list[indexPath.row]
delegate?.addNew(todo: item)
}
我正在努力做到这一点,以便当我在 listtableviewcontroller 上单击我的数组中的一项时,它会将此选择传递给 dataaddedtableviewcontroller 并附加该选择,以便我可以继续添加到列表中。 Storyboard
我尝试使用协议和委托来传递数据,但是传递的只是整个列表本身(我认为这主要是因为我使用了按钮而不是单击单元格,因为我没有否则知道该怎么做)。我也尝试过使用 segues 传递数据,但是我似乎无法在单击单元格后附加数据。
如有任何帮助,我们将不胜感激。非常感谢!
第一视图控制器:
protocol ListTableViewControllerDelegate {
func addNew(todo: String)
}
class ListTableViewController: UITableViewController {
var delegate: ListTableViewControllerDelegate?
var list = ["chicken", "phone", "water"]
@IBAction func saveToList(_ sender: Any) {
delegate?.addNew(todo: "\(list)")
navigationController?.popToRootViewController(animated: true)
}
override func viewDidLoad() {
super.viewDidLoad()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete implementation, return the number of rows
return list.count
}
}
第二个视图控制器:
class DataAddedTableViewController: UITableViewController, ListTableViewControllerDelegate {
var dataAdded = [String]()
func addNew(todo: String) {
dataAdded.append(todo)
tableView.reloadData()
}
override func viewDidLoad() {
super.viewDidLoad()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete implementation, return the number of rows
return dataAdded.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
cell.textLabel?.text = dataAdded[indexPath.row]
return cell
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let destVC = segue.destination as? ListTableViewController {
destVC.delegate = self as ListTableViewControllerDelegate
}
}
}
您需要找出用户点击的列表项的索引。目前你只是通过了整个列表。此行需要调整:
之前:
@IBAction func saveToList(_ sender: Any) {
delegate?.addNew(todo: list)
navigationController?.popToRootViewController(animated: true)
}
之后:
@IBAction func saveToList(_ sender: Any) {
let index = CODE_NEEDE_HERE //figure out how to find out the index of the list
delegate?.addNew(todo: list[index])
navigationController?.popToRootViewController(animated: true)
}
我猜你有正当理由不使用委托方法 tableView(_:didSelectRowAt:)?
使用 tableView(_:didSelectRowAt:)
解决方案可能是这样的:
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let item = list[indexPath.row]
delegate?.addNew(todo: item)
}