如何在 Swift 3 中将 UIButton 添加到我的 UITableViewCell 中?

Posted

技术标签:

【中文标题】如何在 Swift 3 中将 UIButton 添加到我的 UITableViewCell 中?【英文标题】:How do I add a UIButton into my UITableViewCell in Swift 3? 【发布时间】:2016-11-28 18:03:40 【问题描述】:

我有一个现有的 UITableView 可以显示数据并且工作正常。

但是我现在想在这个 UITableViewCell 中添加一个信息按钮。

我将 UIButton 直接添加到情节提要的 TableViewCell 中。然后我尝试将此按钮声明为插座,但出现错误

“插座不能连接到重复的内容。”

我阅读了这个主题并决定创建一个名为“

import UIKit

class PersonalStatsTableViewCell: UITableViewCell 

@IBOutlet weak var personalStatsInfoButton: UIButton!

var selectedCellTitle: String?


override func awakeFromNib() 
    super.awakeFromNib()



override func setSelected(_ selected: Bool, animated: Bool) 
    super.setSelected(selected, animated: animated)

    // Configure the view for the selected state



如你所见,我在这个子类中声明了 UIButton personalStatsInfoButton

随着有关该主题的更多阅读,我认为我需要添加以下内容:

personalStatsInfoButton.tag = indexPath.row
personalStatsInfoButton.addTarget(self, action: "infoButtonClicked", forControlEvents: UIControlEvents.TouchUpInside)

然后有一个函数:

function infoButtonClicked(sender:UIButton)
      let infoCell = sender.tag
      print (infoCell)

我的问题是我不知道是否需要获取所有现有的 tableView 代码并将其转移到新的子类 PersonalStatsTableViewCell 或只是处理信息按钮的部分。

下面是我现有的 VC 代码,它在添加这个新按钮之前最初处理 TableView。

import UIKit

class ShowCommunityViewController: UIViewController, UITableViewDelegate, UITableViewDataSource 

@IBOutlet weak var membersTableView: UITableView!

@IBOutlet weak var communityName: UILabel!
var communityIsCalled: String?
var comIds =  [String]()
var communityId: Int?


var selectedCellTitle: String?
var cellId: Int?

var communityPlayerIds =  [String]()
var communityPlayers =  [String?]()

override func viewDidLoad() 

 super.viewDidLoad()

    communityName.text = (communityIsCalled)
    self.membersTableView.delegate = self
    self.membersTableView.dataSource = self
    membersTableView.reloadData()


func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 

    return self.communityPlayers.count


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 

    let cell = tableView.dequeueReusableCell(withIdentifier: "PersonalStatsTableViewCell", for: indexPath as IndexPath)
    cell.textLabel?.text = self.communityPlayers[indexPath.row]
    cell.textLabel?.font = UIFont(name: "Avenir", size: 12)
    cell.textLabel?.textColor = UIColor.white // set to any colour
    cell.layer.backgroundColor = UIColor.clear.cgColor

    return cell




func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 

    self.selectedCellTitle = self.communityPlayers[indexPath.row]
    cellId = indexPath.row






override func viewDidAppear(_ animated: Bool) 

    let myUrl = URL(string: "http://www.???.uk/???/specificCommunity.php?");
    var request = URLRequest(url:myUrl!);
    request.httpMethod = "POST";

    let postString = "id=\(comIds[communityId!])";

    request.httpBody = postString.data(using: String.Encoding.utf8);

    let task = URLSession.shared.dataTask(with: request)  (data: Data?, response: URLResponse?, error: Error?) in

        DispatchQueue.main.async
            

                if error != nil 
                    print("error=\(error)")
                    return
                

                do
                    let json = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String:AnyObject]

                  if let arr = json?["players"] as? [[String:String]] 
                        self.communityPlayerIds = arr.flatMap  $0["id"]!
                        self.communityPlayers = arr.flatMap  $0["user_name"]!
                    self.membersTableView.reloadData()
                       print ("names: ",self.communityPlayers)
                    

                 catch
                    print(error)
                
        
        
    task.resume()





【问题讨论】:

【参考方案1】:

你不需要在你的类中添加任何代码PersonalStatsTableViewCell 你可以管理来自ShowCommunityViewController 的所有东西你需要做的是在你的cellForRowAt 方法中添加这个

cell.personalStatsInfoButton.tag = indexPath.row
cell.personalStatsInfoButton.addTarget(self, action: #selector(infoButtonClicked(sender:), forControlEvents: UIControlEvents.TouchUpInside)

并添加此功能

function infoButtonClicked(sender:UIButton)
      let infoCell = sender.tag
      print (infoCell)

【讨论】:

正如 Rajat 所说,您可以在没有自定义表格视图单元类的情况下执行此操作。只需在 cellForRowAt() 方法中设置每个按钮的目标/操作。然后,您可以使用标签返回索引路径,或者使用按钮的 frame.origin 找出包含按钮的单元格的 indexPath。【参考方案2】:

您的代码和您的想法是正确的,您只需要更改以下行。

除了 Arun B 所说的之外,您还需要确保 xcode 知道 cell 将属于哪种类。

let cell = tableView.dequeueReusableCell(withIdentifier: "PersonalStatsTableViewCell", for: indexPath as IndexPath)

应该是

 let cell = tableView.dequeueReusableCell(withIdentifier: "PersonalStatsTableViewCell", for: indexPath as IndexPath) as! PersonalStatsTableViewCell

【讨论】:

【参考方案3】:

如果自定义类设置不正确,就会发生这种情况。确保 PersonalStatsTableViewCell 在情节提要中设置为 UITableViewCell 的自定义类。

【讨论】:

以上是关于如何在 Swift 3 中将 UIButton 添加到我的 UITableViewCell 中?的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中将多个 UIButton 添加到多个 UIView

Swift:在 UIbutton 中将 fontawesome 图标与字符串混合

在Swift中将UIButton从屏幕右侧定位20px

swift 在代码中将生成的imageView变成UIButton

SDWebImage 使用 Swift 在 CellView 中将图像设置为 UIButton

如何在 Swift 中将触摸事件发送到 nextResponder