簡體   English   中英

如何獲取UIButton在Tableview單元格中的位置,以及如何在Swift中添加目標?

[英]How to get location of UIButton in Tableview cell, and add target in Swift?

我想在Swift的TableviewCell上添加一個按鈕,以彈出一個小的自定義視圖(覆蓋當前視圖),其中包含一些在線信息。

我創建了另一個(“彈出式視圖”的ViewController +自定義視圖,並調整了它的大小。

在tableviewcell類中,在Button.AddTarget(..)相關函數中,我調用了PresentViewController(..)

我有這些問題:

  1. 彈出視圖出現在屏幕頂部,因為我為其設置了固定的X,Y Gfloat。 我希望彈出窗口顯示在每個按鈕的正下方。

如何在TableviewCell的屏幕窗口中獲取按鈕(或觸摸位置)的X,Y坐標

  1. 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上顯示“彈出窗口”。 這意味着,popupview將始終顯示在我單擊的按鈕的正下方。

對於第一個問題,您可以在按鈕的超級視圖上調用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(...)

編輯:

如果您使用的是情節提要,則可以控制將按鈕拖到代碼中,然后創建一個動作。 小心! 不要意外添加插座! 請記住,首先在彈出窗口中將“插座”更改為“動作”!

您要做的是相對於self.view將UITableView中UITableViewCell中的按鈕的CGRect轉換為CGRect。

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

您可以使用此框架的原點來播放彈出視圖的位置

您對“我如何推出特定值(id_item)”有什么含義? 在你的2nd問題?

我建議您將按鈕目標添加到單元格之外(即:在控制器中cell for row實現tableView的dataSource函數cell for row時,請使用button.add target... )。

然后,您可以照常做自己想做的事,祝您好運。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM