gpt4 book ai didi

ios - 如何在 Swift 的 UITableViewCell 中访问 UITableView

转载 作者:行者123 更新时间:2023-11-28 09:33:27 25 4
gpt4 key购买 nike

我有带单元格的 TableView,每个单元格上都有按钮。我想添加一些功能 - 当用户按下单元格中的按钮时,会向服务器发出一些请求并且单元格从 TableView 中消失。

我如何执行此操作?我知道从 tableView 中删除单元格的方法,但要使用它,我需要从它的单元格访问 tableView。

最佳答案

一种方法是向自定义单元格添加回调闭包并在选择单元格时执行它。您的 View Controller 会将此回调连接到 tableView(_,cellForIndexPath:)tableView(_, cellWillAppear:)


import UIKit

class SelectionCallbackTableViewCell: UITableViewCell {
var selectionCallback: (() -> Void)?
@IBOutlet weak var button: UIButton!
@IBAction func buttonTapped(sender: UIButton) {
self.selectionCallback?()
}

override func layoutSubviews() {
super.layoutSubviews()
self.contentView.addSubview(self.button)
}
}

为表格 View 注册单元格。我在 Storyboard 中做到了。


import UIKit

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

@IBOutlet weak var tableView: UITableView!

var array = [1,1]
override func viewDidLoad() {
super.viewDidLoad()

for x in stride(from: 2, through: 30, by: 1){
let i = array[x-2]
let j = array[x-1]
array.append(i+j)
}
}

func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}

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

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! SelectionCallbackTableViewCell
cell.selectionCallback = {
println("\(self.array[indexPath.row]) at \(indexPath.row) on \(tableView) selected")
}
cell.textLabel?.text = "\(self.array[indexPath.row])"
return cell
}

}

现在根据需要实现回调闭包

cell.selectionCallback = {
println("\(self.array[indexPath.row]) at \(indexPath.row) on \(tableView) selected")
}

将产生如下日志

832040 at 29 on <UITableView: 0x7fe290844200; frame = (0 0; 375 667); clipsToBounds = YES; autoresize = RM+BM; gestureRecognizers = <NSArray: 0x7fe2907878e0>; layer = <CALayer: 0x7fe290711e60>; contentOffset: {0, 697}; contentSize: {375, 1364}> selected

所有可能有用的信息都存在:

  • 索引路径
  • 数据源对象
  • 表格 View
  • 细胞

如果你想在成功通知你的服务器后删除单元格,一个简单的解决方案是:

cell.selectionCallback = {
println("\(self.array[indexPath.row]) at \(indexPath.row) on \(tableView) selected")

self.apiManager.deleteObject(obj, success: { response in
self.array.removeAtIndex(indexPath.row)
tableView.reloadData()
}, failure:{ error in
// handle error
})

}

免责声明:
我个人不建议将数据源实现为 UIViewController。它违反了 SOLID 原则。 相反,数据源应该驻留在它们自己的类中。 对于我自己的项目,我使用一个架构,我称之为 "OFAPopulator" ,这让我可以为表或 Collection View 的每个部分创建独立的数据源。 为简洁起见,我选择在此处的 View Controller 中实现它。


我错过了按钮部分。编辑。


示例代码:https://github.com/vikingosegundo/CellSelectionCallback

关于ios - 如何在 Swift 的 UITableViewCell 中访问 UITableView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32170095/

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