英文:
remove a cell from my table from a button within
问题
以下是你提供的代码的翻译部分:
我在尝试从表格中删除单元格时遇到了问题,我尝试创建一些协议,但由于我对这种语言不熟悉,所以想不出很多解决方案。
扩展 CustomTableViewController:UITableViewDataSource {
func tableView(_ tableView: UITableView,
numberOfRowsInSection section: Int) -> Int {
return sneakers.count + 1
}
func tableView(_ tableView: UITableView,
cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if indexPath.row == sneakers.count {
guard let cell = tableView.dequeueReusableCell(withIdentifier: "OrderSummaryView") as? OrderSummaryView else {
print("我永远不会打印")
return OrderSummaryView()
}
return cell
}
let product = sneakers[indexPath.row]
guard let cell = tableView.dequeueReusableCell(withIdentifier: "ExampleCell") as? ExampleCell else {
print("我永远不会打印")
return ExampleCell()
}
print("利用单元格")
cell.configure(product: product)
return cell
}
}
这是我如何使用我的表格单元格
import UIKit
final class ExampleCell: UITableViewCell {
private let productImageView: UIImageView = .init(frame: .zero)
private let categoryLabel: UILabel = .init(frame: .zero)
private let nameLabel: UILabel = .init(frame: .zero)
private let priceLabel: UILabel = .init(frame: .zero)
private let sizeLabel: UILabel = .init(frame: .zero)
private let colorLabel: UILabel = .init(frame: .zero)
private let removeButton = UIButton()
// 用你的透明图片的名称替换 "transparent"
private let clearImage = UIImage(named: "Image-1")
let qtyButton = UIButton()
private let arrowQty = UIImage(named: "Arrow_Qty")
private let wishButton = UIButton()
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: .default, reuseIdentifier: "ExampleCell")
print("已创建新单元格")
setupUI()
setupConstraints()
}
// 使用 coder 进行初始化是当单元格通过 storyboard/XIB 实例化时
required init?(coder: NSCoder) {
fatalError("init(coder:) 尚未实现")
}
func configure(product: Product) {
productImageView.image = product.image
categoryLabel.text = product.category
nameLabel.text = product.name
priceLabel.text = "\(product.price)€"
sizeLabel.text = "尺码:\(product.size)"
colorLabel.text = "颜色:\(product.color)"
}
private func setupUI() {
selectionStyle = .none
let array = [productImageView,
categoryLabel,
nameLabel,
priceLabel,
sizeLabel,
colorLabel,
removeButton,
qtyButton,
wishButton]
array.forEach { view in
view.translatesAutoresizingMaskIntoConstraints = false
addSubview(view)
}
contentView.translatesAutoresizingMaskIntoConstraints = false
productImageView.layer.cornerRadius = 16
categoryLabel.font = FontStyle.uiS.baseUIFont
categoryLabel.textColor = UIColor(named: "GreyScale_400")
nameLabel.font = FontStyle.displayMBold.baseUIFont
nameLabel.textColor = UIColor(named: "GreyScale_700")
priceLabel.font = FontStyle.uiS.baseUIFont
priceLabel.textColor = UIColor(named: "GreyScale_700")
sizeLabel.font = FontStyle.uiXS.baseUIFont
sizeLabel.textColor = UIColor(named: "GreyScale_700")
colorLabel.font = FontStyle.uiXS.baseUIFont
colorLabel.textColor = UIColor(named: "GreyScale_700")
removeButton.setImage(clearImage, for: .normal)
qtyButton.setTitle("数量:1 ", for: .normal)
qtyButton.setImage(arrowQty, for: .normal)
qtyButton.semanticContentAttribute = .forceRightToLeft
qtyButton.layer.cornerRadius = 16
qtyButton.backgroundColor = UIColor(named: "GreyScale_White")
qtyButton.setTitleColor(UIColor(named: "GreyScale_700"), for: .normal)
qtyButton.layer.borderWidth = 1
qtyButton.layer.borderColor = UIColor(named: "GreyScale_400")?.cgColor
qtyButton.titleLabel?.font = FontStyle.uiM.baseUIFont
wishButton.setTitle("移到愿望清单", for: .normal)
wishButton.setTitleColor(UIColor(named: "GreyScale_700"), for: .normal)
wishButton.titleLabel?.font = FontStyle.uiM.baseUIFont
// 给愿望按钮添加下划线
let attributedTitle = NSAttributedString(string: "移到愿望清单", attributes: [.underlineStyle: NSUnderlineStyle.single.rawValue])
wishButton.setAttributedTitle(attributedTitle, for: .normal)
}
private func setupConstraints() {
NSLayoutConstraint.activate([
contentView.widthAnchor.constraint(equalToConstant: 350),
contentView.heightAnchor.constraint(equalToConstant: 242),
productImageView.topAnchor.constraint(equalTo: contentView.topAnchor),
productImageView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 20),
productImageView.widthAnchor.constraint(equalToConstant: 106),
productImageView.heightAnchor.constraint(equalToConstant: 114),
categoryLabel.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 18),
categoryLabel.leadingAnchor.constraint(equalTo: productImageView.trailingAnchor, constant: 32),
categoryLabel.widthAnchor.constraint(equalToConstant: 29),
categoryLabel.heightAnchor.constraint(equalToConstant: 14),
nameLabel.topAnchor.constraint(equalTo: categoryLabel.bottomAnchor, constant: 8),
nameLabel.leadingAnchor.constraint(equalTo: productImageView.trailingAnchor, constant: 32),
nameLabel.widthAnchor.constraint(equalToConstant: 159),
nameLabel.heightAnchor.constraint(equalToConstant: 24),
priceLabel.topAnchor.constraint(equalTo: nameLabel.bottomAnchor, constant: 8),
priceLabel.leadingAnchor.constraint(equalTo: productImageView.trailingAnchor, constant: 32),
priceLabel.widthAnchor.constraint(equalToConstant: 56),
priceLabel.heightAnchor.constraint(equalToConstant: 14),
sizeLabel.topAnchor.constraint(equalTo: priceLabel.bottomAnchor, constant: 16),
sizeLabel.leadingAnchor.constraint(equalTo: productImageView.trailingAnchor, constant: 32),
sizeLabel.widthAnchor.constraint(equalToConstant: 46),
sizeLabel.heightAnchor.constraint(equalToConstant: 12),
colorLabel.topAnchor.constraint(equalTo: priceLabel.bottomAnchor, constant: 16),
colorLabel.leadingAnchor.constraint(equalTo: sizeLabel.trailingAnchor, constant: 16),
colorLabel.widthAnchor.constraint(equalToConstant: 62),
colorLabel.heightAnchor.constraint(equalToConstant: 12),
removeButton.leadingAnchor.constraint(equalTo: contentView.trailingAnchor),
removeButton.widthAnchor.constraint(equalToConstant: 12),
removeButton.heightAnchor.constraint(equalToConstant: 12),
qtyButton.topAnchor.constraint(equalTo: productImageView.bottomAnchor, constant: 32),
qtyButton.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: 32),
qtyButton.widthAnchor.constraint(equalToConstant: 106),
qtyButton.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 20),
qtyButton.heightAnchor.constraint(equalToConstant: 64),
<details>
<summary>英文:</summary>
Im having trouble removing the cell from the table i tried to create some protocols but it didnt work since im new to this language i can't think of many solutions to this.
extension CustomTableViewController: UITableViewDataSource {
func tableView(_ tableView: UITableView,
numberOfRowsInSection section: Int) -> Int {
return sneakers.count + 1
}
func tableView(_ tableView: UITableView,
cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if indexPath.row == sneakers.count {
guard let cell = tableView.dequeueReusableCell(withIdentifier: "OrderSummaryView") as? OrderSummaryView else {
print("I'll never print")
return OrderSummaryView()
}
return cell
}
let product = sneakers[indexPath.row]
guard let cell = tableView.dequeueReusableCell(withIdentifier: "ExampleCell") as? ExampleCell else {
print("I'll never print")
return ExampleCell()
}
print("Utilize cells")
cell.configure(product: product)
return cell
}
}
this is how im using my table cells
import UIKit
final class ExampleCell: UITableViewCell {
private let productImageView: UIImageView = .init(frame: .zero)
private let categoryLabel: UILabel = .init(frame: .zero)
private let nameLabel: UILabel = .init(frame: .zero)
private let priceLabel: UILabel = .init(frame: .zero)
private let sizeLabel: UILabel = .init(frame: .zero)
private let colorLabel: UILabel = .init(frame: .zero)
private let removeButton = UIButton()
// Replace "transparent" with the name of your transparent image
private let clearImage = UIImage(named: "Image-1")
let qtyButton = UIButton()
private let arrowQty = UIImage(named: "Arrow_Qty")
private let wishButton = UIButton()
override init(style: UITableViewCell.CellStyle,reuseIdentifier: String?) {
super.init(style: .default,reuseIdentifier: "ExampleCell")
print("New cell has been create")
setupUI()
setupConstraints()
}
// Init with coder is when the cell is instaciated via storyboard/XIB
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func configure(product: Product) {
productImageView.image = product.image
categoryLabel.text = product.category
nameLabel.text = product.name
priceLabel.text = "\(product.price)€"
sizeLabel.text = "Size: \(product.size)"
colorLabel.text = "Color: \(product.color)"
}
private func setupUI() {
selectionStyle = .none
let array = [productImageView,
categoryLabel,
nameLabel,
priceLabel,
sizeLabel,
colorLabel,
removeButton,
qtyButton,
wishButton]
array.forEach { view in
view.translatesAutoresizingMaskIntoConstraints = false
addSubview(view)
}
contentView.translatesAutoresizingMaskIntoConstraints = false
productImageView.layer.cornerRadius = 16
categoryLabel.font = FontStyle.uiS.baseUIFont
categoryLabel.textColor = UIColor(named: "GreyScale_400")
nameLabel.font = FontStyle.displayMBold.baseUIFont
nameLabel.textColor = UIColor(named: "GreyScale_700")
priceLabel.font = FontStyle.uiS.baseUIFont
priceLabel.textColor = UIColor(named: "GreyScale_700")
sizeLabel.font = FontStyle.uiXS.baseUIFont
sizeLabel.textColor = UIColor(named: "GreyScale_700")
colorLabel.font = FontStyle.uiXS.baseUIFont
colorLabel.textColor = UIColor(named: "GreyScale_700")
removeButton.setImage(clearImage, for: .normal)
qtyButton.setTitle("Qty:1 ", for: .normal)
qtyButton.setImage(arrowQty, for: .normal)
qtyButton.semanticContentAttribute = .forceRightToLeft
qtyButton.layer.cornerRadius = 16
qtyButton.backgroundColor = UIColor(named: "GreyScale_White")
qtyButton.setTitleColor(UIColor(named: "GreyScale_700"), for: .normal)
qtyButton.layer.borderWidth = 1
qtyButton.layer.borderColor = UIColor(named: "GreyScale_400")?.cgColor
qtyButton.titleLabel?.font = FontStyle.uiM.baseUIFont
wishButton.setTitle("Move to wishlist", for: .normal)
wishButton.setTitleColor(UIColor(named: "GreyScale_700"), for: .normal)
wishButton.titleLabel?.font = FontStyle.uiM.baseUIFont
//underline wishButton
let attributedTitle = NSAttributedString(string: "Move to wishlist", attributes: [.underlineStyle: NSUnderlineStyle.single.rawValue])
wishButton.setAttributedTitle(attributedTitle, for: .normal)
}
private func setupConstraints() {
NSLayoutConstraint.activate([
contentView.widthAnchor.constraint(equalToConstant: 350),
contentView.heightAnchor.constraint(equalToConstant: 242),
productImageView.topAnchor.constraint(equalTo: contentView.topAnchor),
productImageView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 20),
productImageView.widthAnchor.constraint(equalToConstant: 106),
productImageView.heightAnchor.constraint(equalToConstant: 114),
categoryLabel.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 18),
categoryLabel.leadingAnchor.constraint(equalTo: productImageView.trailingAnchor, constant: 32),
categoryLabel.widthAnchor.constraint(equalToConstant: 29),
categoryLabel.heightAnchor.constraint(equalToConstant: 14),
nameLabel.topAnchor.constraint(equalTo: categoryLabel.bottomAnchor, constant: 8),
nameLabel.leadingAnchor.constraint(equalTo: productImageView.trailingAnchor, constant: 32),
nameLabel.widthAnchor.constraint(equalToConstant: 159),
nameLabel.heightAnchor.constraint(equalToConstant: 24),
priceLabel.topAnchor.constraint(equalTo: nameLabel.bottomAnchor, constant: 8),
priceLabel.leadingAnchor.constraint(equalTo: productImageView.trailingAnchor, constant: 32),
priceLabel.widthAnchor.constraint(equalToConstant: 56),
priceLabel.heightAnchor.constraint(equalToConstant: 14),
sizeLabel.topAnchor.constraint(equalTo: priceLabel.bottomAnchor, constant: 16),
sizeLabel.leadingAnchor.constraint(equalTo: productImageView.trailingAnchor, constant: 32),
sizeLabel.widthAnchor.constraint(equalToConstant: 46),
sizeLabel.heightAnchor.constraint(equalToConstant: 12),
colorLabel.topAnchor.constraint(equalTo: priceLabel.bottomAnchor, constant: 16),
colorLabel.leadingAnchor.constraint(equalTo: sizeLabel.trailingAnchor, constant: 16),
colorLabel.widthAnchor.constraint(equalToConstant: 62),
colorLabel.heightAnchor.constraint(equalToConstant: 12),
removeButton.leadingAnchor.constraint(equalTo: contentView.trailingAnchor),
removeButton.widthAnchor.constraint(equalToConstant: 12),
removeButton.heightAnchor.constraint(equalToConstant: 12),
qtyButton.topAnchor.constraint(equalTo: productImageView.bottomAnchor, constant: 32),
qtyButton.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: 32),
qtyButton.widthAnchor.constraint(equalToConstant: 106),
qtyButton.leadingAnchor.constraint(equalTo: contentView.leadingAnchor,constant: 20),
qtyButton.heightAnchor.constraint(equalToConstant: 64),
wishButton.topAnchor.constraint(equalTo: colorLabel.bottomAnchor, constant: 56),
wishButton.leadingAnchor.constraint(equalTo: qtyButton.trailingAnchor, constant: 128),
wishButton.widthAnchor.constraint(equalToConstant: 116),
wishButton.heightAnchor.constraint(equalToConstant: 16),
])
}
}
this is where i declared the stuff thats inside the cells with this i want the remove button to remove the cell from the table and the view can u guys help me?
</details>
# 答案1
**得分**: 0
在你的单元格中添加一个按钮操作,然后添加一个闭包,以便你的单元格可以告诉表视图控制器按钮被点击了。
所以,在 `ExampleCell` 中...
添加一个闭包:
```swift
final class ExampleCell: UITableViewCell {
// 闭包
var removeMe: ((ExampleCell) -> ())?
还在 ExampleCell
中,在你"设置UI"之后,为你的按钮添加一个动作:
removeButton.addTarget(self, action: #selector(removeButtonTapped(_:)), for: .touchUpInside)
选择器函数可以像这样:
@objc func removeButtonTapped(_ sender: UIButton) {
print("Tapped remove button")
// 调用闭包
removeMe?(self)
}
现在,在你的控制器中,当你在 cellForRowAt
中取出单元格时,设置闭包:
let product = sneakers[indexPath.row]
guard let cell = tableView.dequeueReusableCell(withIdentifier: "ExampleCell") as? ExampleCell else {
print("I'll never print")
return ExampleCell()
}
print("Utilize cells")
cell.configure(product: product)
// 配置闭包
cell.removeMe = { [weak self] aCell in
guard let self = self,
let idxPath = self.tableView.indexPath(for: aCell)
else { return }
print("Update data and remove cell from table view...")
self.sneakers.remove(at: idxPath.row)
self.tableView.deleteRows(at: [idxPath], with: .automatic)
}
return cell
作为一个附注 - 当出队单元格时不要使用 guard let ...
:
// 不要这样做
//guard let cell = tableView.dequeueReusableCell(withIdentifier: "ExampleCell") as? ExampleCell else {
// print("I'll never print")
// return ExampleCell()
//}
// 像这样出队单元格
let cell = tableView.dequeueReusableCell(withIdentifier: "ExampleCell", for: indexPath) as! ExampleCell
如果你错误地注册了表视图单元格,你希望应用程序崩溃,以便你可以解决问题。
英文:
You want to add a button action in your cell, then add a closure so your cell can tell the table view controller that the button was tapped.
So, in ExampleCell
...
Add a closure:
final class ExampleCell: UITableViewCell {
// closure
var removeMe: ((ExampleCell) -> ())?
also in ExampleCell
- after you've "setup the UI", add an action for your button:
removeButton.addTarget(self, action: #selector(removeButtonTapped(_:)), for: .touchUpInside)
the selector func can look like this:
@objc func removeButtonTapped(_ sender: UIButton) {
print("Tapped remove button")
// call the closure
removeMe?(self)
}
Now, in your controller, when you dequeue the cell in cellForRowAt
, set the closure:
let product = sneakers[indexPath.row]
guard let cell = tableView.dequeueReusableCell(withIdentifier: "ExampleCell") as? ExampleCell else {
print("I'll never print")
return ExampleCell()
}
print("Utilize cells")
cell.configure(product: product)
// configure the closure
cell.removeMe = { [weak self] aCell in
guard let self = self,
let idxPath = self.tableView.indexPath(for: aCell)
else { return }
print("Update data and remove cell from table view...")
self.sneakers.remove(at: idxPath.row)
self.tableView.deleteRows(at: [idxPath], with: .automatic)
}
return cell
As a side note -- don't use guard let ...
when dequeuing a cell:
// don't do it like this
//guard let cell = tableView.dequeueReusableCell(withIdentifier: "ExampleCell") as? ExampleCell else {
// print("I'll never print")
// return ExampleCell()
//}
// dequeue the cell like this
let cell = tableView.dequeueReusableCell(withIdentifier: "ExampleCell", for: indexPath) as! ExampleCell
If you have incorrectly registered your table view cells, you want the app to crash so you can fix the issue.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论