单击按钮将项目添加到另一个视图控制器表视图

Posted

技术标签:

【中文标题】单击按钮将项目添加到另一个视图控制器表视图【英文标题】:Add items to another view controller table view on button click 【发布时间】:2019-06-29 10:02:44 【问题描述】:

我有一个名为 ListViewController 的视图控制器和另一个名为 AddFoodViewController 的视图控制器。在 ListViewController 中,用户可以将自己的成分添加到以表格视图显示的杂货清单中。当他们转到 AddFoodViewController 时,用户应该能够单击一个按钮,上面写着“添加到列表”,这会将配料​​数组(已经在表格视图中显示)添加到购物清单中。我是新手,所以我想知道是否有人可以提供帮助?我已经成功地让 ListViewController 工作了,但是我不确定如何将 AddFoodViewController 中的成分数组添加到以前的 ListViewController 中。

class AddFoodViewController: UIViewController, UITableViewDataSource, UITableViewDelegate


@IBOutlet weak var FoodTableView: UITableView!
@IBOutlet weak var sendFoodBtn: UIButton!

//array of food
let array = ["1 Salad", "3oz Chicken", "2 Tomatoes", "2 Cucumbers"]
let category = ""

override func viewDidLoad() 
        super.viewDidLoad()



//display array in table view
func numberOfSectionsInTableView(tableView: UITableView) -> Int 
        return 1
    

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return(array.count)
    

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let foodCell = UITableViewCell(style: UITableViewCell.CellStyle.default, reuseIdentifier: "foodCell")
        foodCell.textLabel?.text = array[indexPath.row]
        foodCell.backgroundColor = .clear
        foodCell.textLabel?.textColor = .darkGray
        foodCell.textLabel?.font = UIFont(name: (foodCell.textLabel?.font.fontName)!, size:17)
        return foodCell

    


//button that is supposed to add all ingredients to the ListViewController
 @IBAction func addOnClick(_ sender: Any) 





override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
    if(segue.identifier == "toList")
       let vc = (segue.destination as! ListViewController)
       vc.category = array
           
    

【问题讨论】:

单击添加按钮时,将新数据追加到数组中并重新加载 tableView 以显示新数据 不相关但在cellForRow 中初始化单元格是非常糟糕的做法。在 Interface Builder 中设计一个原型单元并重用它。而return不是函数,去掉括号:return array.count 我有点困惑。你说 List Then food,但我看到 segue 是从 food 到 list。 @AnkurLahiry,这就是我想做的。将 AddFoodViewController 中数组中的食物成分添加到杂货清单 (ListViewController) 表格视图中。但我不知道该怎么做,我试过 segue 但我认为我做错了,或者我需要使用委托,因为杂货清单在以前的视图控制器中?但我不知道具体如何实现。 @Wings 你会怎么做?我需要委托吗? 【参考方案1】:

将数据传递给前一个视图控制器可以通过委托模式来实现,首先,在你的AddFoodViewController中声明一个协议,并在视图控制器中定义一个委托属性。

// AddFoodViewController.swift
protocol AddFoodViewControllerDelegate 
    func addIngredient(array: [String])


class AddFoodViewController: UIViewController 
  ...
  var delegate: AddFoodViewControllerDelegate?

  // MARK: add function
  func actionAdd() 
    delegate?addIngredient(array)
  
  ...

回到你的ListViewController,找到你的AddFoodViewController的segue目标视图控制器(记得在故事板中分配它的类名),并将委托分配给自己。

// ListViewController.swift
override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
    ...
    let vc = segue.destination as? AddFoodViewController
    vc?.delegate = self
    ...


// in the same file, implement delegate method here
extension ListViewController: AddFoodViewControllerDelegate 
    func addIngredient(array: [String]) 
        items += array
        // do table reload or something
    

【讨论】:

我尝试实现代码,但由于某种原因,当我尝试在扩展中附加数组时,它给了我“使用未解析的标识符'数组'” 还需要有关您的代码和 ListViewController 代码的更多信息,不要只是复制和粘贴,一些变量命名不一样。 ListViewController 基本上是一个购物清单,用户可以在其中添加和删除自己的杂货项目:var items: [String] = []。另一个视图控制器 (AddFoodViewController) 在内部包含一个 tableview,它显示特定膳食的一系列成分。因此,当用户按下“添加到列表”按钮时,这些食材会自动添加到购物清单中。 AddFoodViewController 中的成分数组是 var array = ["1 Salad", "3oz Chicken", "2 Tomatoes", "2 Cucumbers"] ,所以我不确定为什么当我尝试将它附加到 ListViewController 扩展中时它会给我一个错误。抱歉,我希望我能清楚地解释这一点,而且是有道理的。 视图层次结构:ListViewController -> AddFoodViewController 对吗? override func prepare(for segue: UIStoryboardSegue, sender: Any?) 应该在 ListViewController 中实现

以上是关于单击按钮将项目添加到另一个视图控制器表视图的主要内容,如果未能解决你的问题,请参考以下文章

单击按钮后将名称附加到数组,然后将其发送到另一个视图控制器

在 android 中单击按钮时将列表视图中的选中项目转移到另一个列表视图

单击tableview标题按钮时如何将tableviewcell内的collectionview中的数据显示到另一个视图控制器

将数据从视图控制器发送到另一个

如何通过单击按钮在 Swift UI 中从一个视图导航到另一个视图

将按钮超级视图控制器添加到另一个视图控制器时,UIButton 目标无法识别