在swift中访问委托函数中的选定单元格部分

时间:2018-05-15 11:09:33

标签: ios swift uitableview

我从API服务获取数据,我将其传递给我的tableview并在其下创建部分和单元格。段和单元的数量是动态的,取决于来自服务的数据。我的手机上有一个按钮。按钮名称是添加。当我单击添加按钮时,它会显示包含tableview的警报。警报中的此表视图仅显示与其部分下的特定单元格相关的数据。我为按钮创建了一个委托方法,我在其中获取所选按钮的indexPath.row,并将数据从我的模型传递到警报内的表视图。当我点击第一个单元格添加按钮时,它显示一切正常,但是当我点击第2节中的添加按钮时。我观察到该应用程序崩溃,因为编译器只获取indexPath.row但它没有获得有关此单元格的哪个部分的信息。如何在按下添加按钮时了解我的委托功能选择哪个部分单元格。这是我的单元格类中的委托函数的代码,

protocol ResMenuDetailDelegate {
func addOnBtnTapped(tappedIndex : Int)
}

 var delegate: ResMenuDetailDelegate?

 @IBAction func addBtnTapped(_ sender: Any) {
    delegate?.addOnBtnTapped(tappedIndex: addBtn.tag)
}

在我的视图控制器类中,我遵循委托方法

extension RestaurantMenuDetailVC : ResMenuDetailDelegate{
func addOnBtnTapped(tappedIndex: Int) {

    print(tappedIndex)

    let addonCategory = subCategoryModel![tappedIndex].items[tappedIndex].addonCategory
  print(addonCategory as Any)
}

这是我的cellForRow表视图委托,

  func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    if tableView == resMenuTableView{

        let cell = resMenuTableView.dequeueReusableCell(withIdentifier: "detailMenuCell", for: indexPath) as! RestaurantMenuDetailTVC

        cell.dishTitleLbl.text = subCategoryModel![indexPath.section].items[indexPath.row].itemName
        cell.descriptionLbl.text = subCategoryModel![indexPath.section].items[indexPath.row].itemDescription
        cell.priceLbl.text = String(subCategoryModel![indexPath.section].items[indexPath.row].itemPrice)
        cell.addBtn.tag = indexPath.row
        cell.delegate = self
        cell.selectionStyle = .none
        cell.backgroundColor = UIColor.clear
        return cell

    }

3 个答案:

答案 0 :(得分:2)

你需要发送indexpath,因为你访问的数组模型部分超出了它的行值

func addOnBtnTapped(tappedIndex : IndexPath)

//

extension RestaurantMenuDetailVC : ResMenuDetailDelegate{
 func addOnBtnTapped(tappedIndex: IndexPath) {

   print(tappedIndex)

   let addonCategory = subCategoryModel![tappedIndex.section].items[tappedIndex.row].addonCategory
 print(addonCategory as Any)
}

//

 @IBAction func addBtnTapped(_ sender: Any) {
   delegate?.addOnBtnTapped(tappedIndex:self.myIndexPath)
}

//

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

if tableView == resMenuTableView{

    let cell = resMenuTableView.dequeueReusableCell(withIdentifier: "detailMenuCell", for: indexPath) as! RestaurantMenuDetailTVC

    cell.myIndexPath = indexPath 
 }

//

并在单元格中声明var

var myIndexPath:IndexPath!

答案 1 :(得分:1)

我认为你必须在协议中传递两个参数。

protocol ResMenuDetailDelegate {
func addOnBtnTapped(tappedIndex : Int, button: UIButton)
}

答案 2 :(得分:0)

  

更改协议,这样你就可以拥有两个值   行和部分。

    protocol ResMenuDetailDelegate {
    func addOnBtnTapped(tappedIndexRow: Int,tappedIndexSection: Int )
    }
    var delegate: ResMenuDetailDelegate?

 @IBAction func addBtnTapped(_ sender: Any) {
    delegate?.addOnBtnTapped(tappedIndexRow: addBtn.tag,tappedIndexSection: section )
}
  

在这里,您可以获取节值tableview的委托方法   cellForRowAt。   在自定义单元格中添加变量

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        ...
        ...
        cell.addBtn.tag = indexPath.row
        cell.section = indexPath.section
        ...
        ...
    }