データを表示して正常に動作している既存のUITableViewがあります。Swift 3のUITableViewCellにUIButtonを追加するにはどうすればよいですか?
ただし、このUITableViewCellに情報ボタンを追加します。
私はストーリーボードのTableViewCellに直接UIButtonを追加しました。このボタンをコンセントとして宣言しようとしましたが、エラーが発生しました。
「アウトレットはリピートコンテンツに接続できません」私は主題を中心に読んで、あなたは、私がこのサブクラスにUIButton
personalStatsInfoButton
を宣言している見ることができるように「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 } }
と呼ばれる新しいサブクラスを作成することを決めた。
をより読みで
personalStatsInfoButton.tag = indexPath.row
personalStatsInfoButton.addTarget(self, action: "infoButtonClicked", forControlEvents: UIControlEvents.TouchUpInside)
して、機能を持っています:対象の周りに私は私のようなものを追加する必要があると考えてい
function infoButtonClicked(sender:UIButton){
let infoCell = sender.tag
print (infoCell)
}
私の問題は、私は私はすべての既存のtableViewコードを取得し、新しいサブクラスPersonalStatsTableViewCell
やinfoボタンを扱う部分だけにそれを転送する必要があるかどうかわからないです。
以下は、最初は前にこの新しいボタンに追加するにはテーブルビューを扱う私の既存のVCコードです。
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()
}
}
Rajatによると、カスタムテーブルビューセルクラスなしでこれを行うことができます。 cellForRowAt()メソッドで各ボタンのターゲット/アクションを設定するだけです。次に、タグを使用してインデックスパスを返すか、ボタンのframe.originを使用して、ボタンが含まれているセルのindexPathを調べることができます。 –