当前位置: 首页 > 知识库问答 >
问题:

如何更改UITableViewRowAction的标题

孟浩慨
2023-03-14

我有一个用例,我需要更改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)"
    });

共有3个答案

卢毅
2023-03-14

@JAL是完全正确的-您需要制作自己的滑动视图来实现这一点,或者可以重新加载单元格并在下一张幻灯片上更新它。只是为了好玩,我试图通过子视图找到标签,并能够找到它,但有趣的是苹果以某种方式阻止了对该标签文本的任何更改。您可以更改它的背景颜色/其他属性,但不能更改文本!

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) {

    }

}
郭单鹗
2023-03-14

此答案使用私有API,不建议在应用商店中使用。显然,无法更改本机UITableViewRowAction标题。您可能必须按照其他人的建议实施自定义解决方案,以实现您想要的结果。

这里我将遍历UITableViewCell的子视图,其中包含私有子视图,并且可能会发生更改,因此如果苹果更改视图层次结构,您的代码可能会在未来的iOS版本中崩溃。我在这里找到了UIButtonLabel的标题。

9.2iOS当前视图层次结构是

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]
} 

禹昆
2023-03-14

这里有一个简单的例子。

假设你有一家有名字和价值的一流餐厅:

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

初始化一组餐厅对象,并将它们放入名为数据源的数组中。您的表视图数据源方法如下所示:

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.
}

我不打算从头开始写一个可滚动的单元格,因为这个问题有很多选项可以使用。

然而,我对安德鲁·卡特试图迭代子视图以直接访问编辑操作中的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)
            }
        }

    }
}
 类似资料:
  • 问题内容: 我做了一个自定义的UITableViewRowAction。现在,我想添加图像而不是文本。我知道这是可能的,但不知道该怎么做。你们中有人知道如何在Swift中做到这一点,并想帮助我吗?感谢您的回答! 问题答案: 迅速 苹果公司引入了灵活的方式来声明行操作,从而带来了巨大的好处。 例: iOS 8.0 您需要将UIImage设置为行操作的backgroundColor,具体来说是: 迅速

  • 是否可以更改事件接收的对象的标头? 两次尝试: > 修改现有标题: 失败,原因是。 创建新的请求对象: 失败与

  • 问题内容: 有人知道如何更改pygame图标吗?我在pygame网站上发现了一个可以让您执行此操作的东西,但是当我尝试操作时,它只会使pygame窗口很小。 问题答案: 首先将图标图像加载为表面,然后用于更改图标。 编辑:由于询问者不知道什么是表面 来自http://www.pygame.org/docs/ref/surface.html上的文档 “ pygame Surface用于表示任何图像。

  • 问题内容: 我看了文件。 但我想我一定误会了。 我也尝试过 我想更改为 都不起作用。 问题答案: 使用JSONP时,无法控制浏览器发送的标头。JSONP是一个聪明的把戏(或者是一个hack,具体取决于您对它的看法…),其中包括插入指向服务器端点的标记。最终,这是一个浏览器,它会在通过标签请求脚本时决定要发送的标头,并且您不能影响它。

  • 我正在尝试在Android的ActionBar上做一些事情。 我已经在操作栏的右侧添加了新项目。 如何更改操作栏的左侧?我想改变图标和文本,我想在其他屏幕的操作栏中添加一个“后退按钮

  • 问题内容: 如何使用Swift更改UIAlertController的Title字体? 我不是在谈论消息的颜色,我不是在谈论按钮的颜色。 我说的是标题。 问题答案: 在我的答案中添加了正确的代码行,因为它比下面的答案更加简洁。