2016-11-28 16 views
0

データを表示して正常に動作している既存の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() 


} 

} 

答えて

0

あなたのコードと何を考えている正しいですが、あなただけの次の行を変更する必要があります。

別にアルンBが言ったことから、あなたはXcodeのが属するクラスcellの種類を知っていることを確認する必要があります。あなたはShowCommunityViewControllerからすべてのものを管理することができますPersonalStatsTableViewCell

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

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

カスタムクラスが正しく設定されていない場合に発生します。ストーリーボードのUITableViewCellのカスタムクラスとしてPersonalStatsTableViewCellが設定されていることを確認してください。

enter image description here

1

する必要がありますあなたが行わために必要なものを自分のクラスで任意のコードを配置する必要はありません。この

を追加するには、 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) 
} 
+1

Rajatによると、カスタムテーブルビューセルクラスなしでこれを行うことができます。 cellForRowAt()メソッドで各ボタンのターゲット/アクションを設定するだけです。次に、タグを使用してインデックスパスを返すか、ボタンのframe.originを使用して、ボタンが含まれているセルのindexPathを調べることができます。 –

関連する問題