如何在 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...
)。
那你就可以像往常一样做你想做的事了,祝你好运。
【讨论】:
请记住,当您发布堆栈溢出问题/答案时,您必须使用正确的拼写和语法。不要使用ur
和blahblah
之类的词,尽量具体和to-the-point
。问答网站不是俚语的地方,您正在努力帮助人们不要让他们更加困惑?。话虽如此,欢迎来到 Stack Overflow ?以上是关于如何在 Tableview 单元格中获取 UIButton 的位置,并在 Swift 中添加目标?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Tableview 单元格中获取 UIButton 的位置,并在 Swift 中添加目标?
如何从单元格中的按钮操作获取 tableview 中的 indexPath?