如何从Swift中的UITableViewCell访问UITableView

时间:2015-08-23 18:37:03

标签: ios swift

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

我怎么能这样做?我知道从tableView中删除单元格但要使用它的方法我需要从它的单元格中访问tableView。

1 个答案:

答案 0 :(得分:9)

一种方法是将回调闭包添加到自定义单元格并在单元格选择时执行它。您的视图控制器会在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)
    }
}

为tableview注册单元格。我在故事板中做到了。

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

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

  • indexPath
  • 数据源对象
  • 表格视图
  • 细胞

如果要在成功通知服务器后删除单元格,请执行以下操作:

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"的架构,它允许我为表或集合视图的每个部分创建独立的数据源。 为了简洁起见,我选择在视图控制器中实现它。

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

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