我从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
}
答案 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
...
...
}