[英]How to change the title for UITableViewRowAction
我有一個用例,我需要更改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)"
});
這是一個快速而骯臟的例子。
假設你有一個餐廳,名字和喜歡的價值:
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.
}
我不打算從頭開始編寫可滾動的單元格,因為這個問題有很多你可以使用的選項。
然而,我對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)
}
}
}
}
此答案使用私有API , 不建議在App Store上使用。 顯然,無法更改本機UITableViewRowAction
的title
。 您可能必須按照其他人的建議實施自定義解決方案,以實現您想要的結果。
在這里,我將遍歷UITableViewCell
的子視圖,其中包含私有子視圖,並且可能會發生變化,因此如果Apple更改視圖層次結構,您的代碼可能會在未來的iOS版本上崩潰。 我在這里找到了UIButtonLabel
的標題。
iOS 9.2的當前視圖層次結構是
UITableViewCell
UITableViewCellDeleteConfirmationView
_UITableViewCellActionButton
UIButtonLabel
UIButton
這是代碼:
func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [UITableViewRowAction]? {
let shareAction = UITableViewRowAction(style: .Default, title: "\(dataList[indexPath.row].likes)") { (action, indexPath) -> Void in
self.dataList[indexPath.row].likes++
let cell = tableView.cellForRowAtIndexPath(indexPath)
let privateView = cell!.subviews[0].subviews[0].subviews[0]
let privateButton = privateView.valueForKey("_button") as! UIButton
privateButton.setTitle("\(self.dataList[indexPath.row].likes)", forState: .Normal)
}
return [shareAction]
}
@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) {
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.