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

时间:2016-07-23 11:38:52

标签: ios swift uitableview uibutton

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

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

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

我有这些问题:

  1. 弹出视图出现在屏幕顶部,因为我为它设置了固定的X,Y Gfloat。我希望弹出窗口显示在每个按钮的下方。
  2. 如何在 TableviewCell 的屏幕窗口中获取按钮(或触摸位置)的 X,Y坐标

    1. TableviewCell 中,当我点击按钮(不是单元格)时,如何推送特定值(id_item)来请求数据?
    2. 我搜索过但大多数相关的答案都是关于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

      enter image description here

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

3 个答案:

答案 0 :(得分:4)

对于第一个问题,您可以在按钮的超级视图上调用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(...)

编辑:

如果您正在使用故事板,则可以控制 - 将按钮拖到代码中,然后创建一个Action。小心!不要意外添加插座!请记住在弹出窗口中首先将“Outlet”更改为“Action”!

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

您对“如何推送特定值(id_item)”有什么意义?你的2nd问题?

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

然后你可以照常做你想做的事,祝你好运。