gpt4 book ai didi

ios - 如何使用单独的 UITableViewDataSource 类管理#selector?

转载 作者:行者123 更新时间:2023-11-28 05:36:03 25 4
gpt4 key购买 nike

我的 UITableView 有一个单独的 UITableViewDataSource

import UIKit

class CardDataSource: NSObject, UITableViewDataSource {

//MARK:- Property
var medialObjects: [MediaCardObject]?
let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
var viewController: AddNewVC?

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return medialObjects?.count ?? 0
}

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

let obj = medialObjects![indexPath.row]

let cell = tableView.dequeueReusableCell(withIdentifier: "MediaTextTableViewCell") as! MediaTextTableViewCell

cell.btnDelete.tag = indexPath.row
cell.btnDelete.addTarget(self, action: #selector(AddNewVC.deleteItem(sender:)), for: .touchUpInside)
cell.tfCardText.text = obj.path
cell.tfCardText.tag = indexPath.row
cell.tfCardText.returnKeyType = .done
cell.tfCardText.delegate = viewController
cell.selectionStyle = .none
return cell
}
}

数据在我的 UITableView 上加载正常,但问题是当我点击删除按钮时它崩溃并显示

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[MediaCards.CardDataSource deleteItemWithSender:]: unrecognized selector sent to instance 0x600003394cc0'

我也试过

cell.btnDelete.addTarget(self, action: #selector(viewController?.deleteItem(sender:)), for: .touchUpInside)

这里是AddNewVC中的删除方法

//MARK:- Delete
@objc func deleteItem(sender: UIButton) {

let selectedIndex = sender.tag
deleteObjectIndexPath = IndexPath(row: selectedIndex, section: 0)
confirmDelete()
}

AddNewVC 类中

var tblDataSource = CardDataSource()

override func viewDidLoad() {
super.viewDidLoad()

tblDataSource.viewController = self
tblMediaCards.dataSource = tblDataSource

if forEdit {
let cards = mediaObject?.cards?.allObjects as! [MediaCard]
for obj in cards {
let mediaCardObj = MediaCardObject.init(type: obj.type ?? "", path: obj.path ?? "", index: Int(obj.index))
self.medialObjects.append(mediaCardObj)
}

medialObjects = medialObjects.sorted(by: { $0.index! < $1.index! })
tblDataSource.medialObjects = medialObjects

self.tblMediaCards.reloadData()
}
}

但它仍然因同样的原因而崩溃。尽管委托(delegate)工作正常。

最佳答案

目标错误:

cell.btnDelete.addTarget(self, action: #selector(AddNewVC.deleteItem(sender:)), for: .touchUpInside)

方法 AddNewVC.deleteItem(sender:) 不是 self 的一部分,而是属于不同的类成员。尝试:

cell.btnDelete.addTarget(self.viewController, action: #selector(AddNewVC.deleteItem(sender:)), for: .touchUpInside)

我宁愿在同一个 View Controller 中有一个目标方法,然后让这个调用数据源/ subview Controller 方法,只是为了安全。

关于ios - 如何使用单独的 UITableViewDataSource 类管理#selector?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58605576/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com