我有一个用例,我需要更改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)"
});
答案 0 :(得分:3)
这是一个快速而又肮脏的例子。
假设您有一个餐厅,名字和喜欢的价值:
class Restaurant {
var name: String?
var likes: Int = 0
}
初始化一堆Restaurant
个对象,并将它们放在一个名为dataSource
的数组中。您的表视图数据源方法如下所示:
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尝试迭代子视图直接访问编辑操作中的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
}
在共享操作中,遍历按钮的子视图。我们正在寻找UITableViewCellDeleteConfirmationView
和_UITableViewCellActionButton
个对象(链接的私有标题以供参考)。
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)
}
}
}
}
答案 1 :(得分:3)
此答案使用私有API ,建议在App Store上使用 NOT 。显然,无法更改原生title
的{{1}}。您可能必须按照其他人的建议实施自定义解决方案,以达到您想要的效果。
这里我正在遍历包含私有子视图的UITableViewRowAction
子视图,并且可能会发生变化,因此如果Apple更改视图层次结构,您的代码可能会在未来的iOS版本中崩溃。
我找到了UITableViewCell
here的标题。
根据iOS 9.2的当前视图层次结构是
UIButtonLabel
以下是代码:
UITableViewCell
UITableViewCellDeleteConfirmationView
_UITableViewCellActionButton
UIButtonLabel
UIButton
答案 2 :(得分:2)
@JAL是完全正确的 - 您需要制作自己的滑动视图才能完成此操作,或者可以重新加载单元格并在下一张幻灯片中更新它。只是为了好玩,我试图通过子视图破解我的方式并找到标签并且能够找到它,但有趣的是Apple以某种方式阻止了对该标签文本的任何更改。您可以更改它的背景颜色/其他属性,但不能更改文本!
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
@IBOutlet var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell")
}
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 1
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath)
return cell
}
func findRowActionLabelForCell(cell: UITableViewCell?) -> UILabel? {
guard let cell = cell else {
return nil
}
var label: UILabel? = nil
for view in cell.subviews {
label = findRowActionLabelForView(view)
if label != nil {
break
}
}
return label
}
func findRowActionLabelForView(view: UIView) -> UILabel? {
for subview in view.subviews {
if let label = subview as? UILabel {
return label
} else {
return findRowActionLabelForView(subview)
}
}
return nil
}
func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [UITableViewRowAction]? {
let action = UITableViewRowAction(style: .Default, title: "Test", handler: { (action, indexPath) -> Void in
let cell = self.tableView.cellForRowAtIndexPath(indexPath)
if let label = self.findRowActionLabelForCell(cell) {
label.text = "New Value"
label.backgroundColor = UIColor.blueColor()
}
})
return [action]
}
func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
}
}