如何在 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 在代码中将生成的imageView变成UIButton