我有一个用例,我需要更改 UITableViewRowAction 的标题。例如,我有一个餐厅单元,向右滑动时会显示“书签(104)”,其中“书签”是操作,104 表示已有 104 人为其添加了书签。单击它时,我希望它更改为“书签(105)”,因为显然有一个新用户(当前用户本人)已将其添加为书签。我怎么做?尝试了下面的代码,它不起作用。

let likeAction = UITableViewRowAction(style: UITableViewRowActionStyle.Default, title: "bookmark\n\(count)", handler:{(action, indexpath) -> Void in
        ....
        count++
        action.title = "bookmark\n\(count)"
    });

最佳答案

这是一个快速而肮脏的例子。

假设您有一个带有 name 和 likes 值的 Restaurant 类:

class Restaurant {
    var name: String?
    var likes: Int = 0
}

您初始化一堆 Restaurant 对象,并将它们放入名为 dataSource 的数组中。您的表 View 数据源方法将如下所示:
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return self.dataSource.count
}


override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = UITableViewCell(style: .Default, reuseIdentifier: "cell");
    cell.textLabel?.text = dataSource[indexPath.row].name

    return cell
}


// Override to support editing the table view.
override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
    // This can be empty if you're not deleting any rows from the table with your edit actions
}

override func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [UITableViewRowAction]? {

    // First, create a share action with the number of likes
    let shareAction = UITableViewRowAction(style: .Default, title: "\(self.dataSource[indexPath.row].likes)") { (action, indexPath) -> Void in

        // In your closure, increment the number of likes for the restaurant, and slide the cell back over
        self.dataSource[indexPath.row].likes++
        self.tableView.setEditing(false, animated: true)
    }

    return [shareAction] // return your array of edit actions for your cell.  In this case, we're only returning one action per row.
}

我不打算从头开始编写可滚动的单元格,因为 this question 有很多您可以使用的选项。

然而,我对 Andrew Carter 尝试遍历 subview 以直接访问编辑操作中的 UIButton 很感兴趣。这是我的尝试:

首先,创建对 UITableViewCell(或单元格数组)的引用,您希望修改,在本例中,我将使用单个单元格:
var cellRef: UITableViewCell?

// ...

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = UITableViewCell(style: .Default, reuseIdentifier: "cell");
    cell.textLabel?.text = dataSource[indexPath.row].name

    cellRef = cell;

    return cell
}

在您的分享操作中,遍历按钮的 subview 。我们正在寻找 UITableViewCellDeleteConfirmationView _UITableViewCellActionButton 对象(链接以供引用的私有(private) header )。
let shareAction = UITableViewRowAction(style: .Default, title: "\(self.dataSource[indexPath.row].likes)") { (action, indexPath) -> Void in

    var deleteConfirmationView: UIView? // UITableViewCellDeleteConfirmationView

        if let subviews = self.cellRef?.subviews {
            for subview in subviews {
                if NSClassFromString("UITableViewCellDeleteConfirmationView") != nil {

                    if subview.isKindOfClass(NSClassFromString("UITableViewCellDeleteConfirmationView")!) {
                        deleteConfirmationView = subview
                        break
                    }
                }
            }
        }

    if let unwrappedDeleteView = deleteConfirmationView {
        if unwrappedDeleteView.respondsToSelector("_actionButtons") {
            let actionbuttons = unwrappedDeleteView.valueForKey("_actionButtons") as? [AnyObject]
            if let actionButton = actionbuttons?.first as? UIButton { // _UITableViewCellActionButton
                actionButton.setTitle("newText", forState: .Normal)
            }
        }

    }
}

10-08 15:41