如何在 Tableview 单元格中获取 UIButton 的位置,并在 Swift 中添加目标?

Posted

技术标签:

【中文标题】如何在 Tableview 单元格中获取 UIButton 的位置,并在 Swift 中添加目标?【英文标题】:How to get location of UIButton in Tableview cell, and add target in Swift? 【发布时间】:2016-07-23 11:38:52 【问题描述】:

我想在 Swift 中的 TableviewCell 上添加一个按钮,以弹出一个小的自定义视图(覆盖当前视图),其中包含一些在线信息。

我为“弹出视图”创建了另一个(ViewController + 自定义视图并调整了它的大小。

在tableviewcell类中,在Button.AddTarget(..)相关函数中,我调用了PresentViewController(..)

我有这些问题:

    弹出视图出现在屏幕顶部,因为我为其设置了固定的 X,Y Gfloat。我希望弹出窗口出现在每个按钮的正下方。

如何在TableviewCell的屏幕窗口中获取按钮(或触摸位置)的X,Y坐标

    TableviewCell中,当我点击按钮(不是单元格)时,如何推送特定值(id_item)来请求数据?

我搜索过,但大多数相关答案都是关于 TableviewController 而不是 TableviewCell。

================================================ =========

我试过了:

import UIKit
import QorumLogs
class TabelViewSearchStockCell: UITableViewCell, UIViewControllerTransitioningDelegate 

    @IBOutlet weak var mainImageView: UIImageView!
    @IBOutlet weak var productCodeLabel: UILabel!

    @IBOutlet weak var titleLabel: UILabel!
    @IBOutlet weak var stockButton: UIButton!

    @IBOutlet weak var view: UIView!

        var cellType:String?
        var searchCell: SearchResult?
            
            didSet
                // 1. set image
                if let imageId = searchCell?.id_img
                    let urlCovertor = GetImgUrl()
                    let urlStr = urlCovertor.getSmall(imageId)
                    let url = NSURL(string: urlStr)
                    mainImageView.sd_setImageWithURL(url)
                
                // 2. set_title
                titleLabel.text = searchCell?.title
                // 3. set product code
                productCodeLabel.text = searchCell?.productcode
                // 4. set price area
                stockButton.addTarget(self, action: #selector(TabelViewSearchStockCell.checkStock), forControlEvents: .TouchUpInside)

            
        

    // MARK: - set location
    private lazy var animatorManager: PresentationManager = 
        let buttonRect = self.stockButton.superview?.convertRect(self.stockButton.frame, toView: self.view)
        let manager = PresentationManager()
        manager.presentFrame = buttonRect!
        return manager
    ()




// MARK:- Listen button
extension TabelViewSearchStockCell
    @objc private func checkStock()
        // create menu
        let sb = UIStoryboard(name: "Popover",bundle: nil)
        guard let menuView = sb.instantiateInitialViewController() else
            return
        
        menuView.transitioningDelegate = animatorManager
        menuView.modalPresentationStyle = UIModalPresentationStyle.Custom
        self.window?.rootViewController?.presentViewController(menuView, animated: true, completion: nil)

    

它仍然总是出现在C1中

我希望当我单击位置 S1 中的按钮时,它会在位置 C2 而不是 C1 中显示“弹出窗口”。这意味着,弹出视图将始终显示在我单击的按钮下方。

【问题讨论】:

请分享您的尝试 【参考方案1】:

对于您的第一个问题,您可以在按钮的超级视图上调用convertRect,它应该是表格视图单元格的内容视图。如果你看不懂 harpreet 给出的代码,这里是快速翻译:

let frame = yourButton.superview.convertRect(yourButton.frame, toView: self.view)

现在这个框架是按钮相对于self.view的框架。

对于第二个问题,您可以设置按钮的tag 属性,然后在表格视图单元格的内容视图上调用viewWithTag 以获取按钮。

方法如下:

如果您的单元格在情节提要中,请选择按钮,然后在右侧的属性检查器中将“标签”设置为某个数字。如果通过代码创建按钮,可以通过

yourButton.tag = someNumber

那么你只需要获取表格视图单元格的contentView 并调用viewWithTag

let contentView = cell.contentView
let button = contentView.viewWithTag(someNumber)!

现在您可以添加目标了!

button.addTarget(...)

编辑:

如果您使用情节提要,您可以控制并拖动按钮到您的代码中,然后创建一个动作。当心!不要意外添加插座!记得在弹窗里先把“Outlet”改成“Action”!

【讨论】:

IBAction 是一种更现代的方式,您应该更新您的答案以包含该选项。 @kabiroberai 已编辑,请删除您的评论。 我认为没有必要删除它,因为它将作为参考 感谢您的回答,但还是有问题。你能检查一下吗?我附上了截图 Swift 4 语法...let frame = yourButton.superview?.convert(yourButton.frame, to: self.view)【参考方案2】:

你要做的是将UITableView中UITableViewCell中按钮的CGRect转换为相对于self.view的CGRect。

CGRect frame = [[youButton superview] convertRect: yourButton.frame toView: self.view];

您可以使用此框架的原点来调整弹出视图的位置

【讨论】:

对不起,我使用了客观的 c 代码。但是您可以轻松地快速转换该代码。【参考方案3】:

您对“如何将特定值 (id_item) 推出”是什么意思?在您的2nd 问题中?

我建议您将按钮目标添加到单元格之外(即:在控制器中实现 tableView 的 dataSource 函数cell for row 时使用button.add target...)。

那你就可以像往常一样做你想做的事了,祝你好运。

【讨论】:

请记住,当您发布堆栈溢出问题/答案时,您必须使用正确的拼写和语法。不要使用urblahblah 之类的词,尽量具体和to-the-point。问答网站不是俚语的地方,您正在努力帮助人们不要让他们更加困惑?。话虽如此,欢迎来到 Stack Overflow ?

以上是关于如何在 Tableview 单元格中获取 UIButton 的位置,并在 Swift 中添加目标?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Tableview 单元格中获取 UIButton 的位置,并在 Swift 中添加目标?

如何从单元格中的按钮操作获取 tableview 中的 indexPath?

如何从 tableview 单元格中搜索数据?

iOS:如何从 tableview 的自定义单元格中的 UITextField 访问值

高度调整到 TableView 单元格中的内容?

在 tableview 单元格中获取 coredata (swift4)