2017-06-02 13 views
0

XIBファイルからカスタムセルを作成して実装していますtableView、 カスタムセルからテキストを実装することはできますが、どのようにボタンを実装して触れることができますか?カスタムセルにボタンを追加するにはどうすればよいですか?

ここで私が書いたコードは次のとおりです。

struct cellData { 

let cell : Int! 
let text : String! 
let button = UIButton() 
} 

var arrayOfData = [cellData]() 

override func viewDidLoad() { 
    super.viewDidLoad() 

arrayOfData = [cellData(cell : 1, text: "ahfhasdf", button: button)] 
} 

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

    if arrayOfData[indexPath.row].cell==1{ 

     let cell=Bundle.main.loadNibNamed("CustomTableViewCell1", owner: self, options: nil)?.first as! CustomTableViewCell1 

     cell.label1.text=arrayOfData[indexPath.row].text 
     cell.pillImage.currentImage=arrayOfData[indexPath].pillImage 

     return cell 
} 

pill私は私のセルにしたいとボタンが押されたときにどのように作用を有することがCustomTableViewCell1でボタンがありますか?助けてください。

+0

ref: - > https://stackoverflow.com/questions/28894765/ios-swift-button-action-in-table-view-cell –

+0

コードのこの部分には非常に多くの問題がありますどこから始めたらいいですか...まず最初に読むチュートリアルを見つけることをお勧めします。[this](https://stackoverflow.com/questions/20655060/get-button-click-inside-ui-table-view-cell )、他の問題は、構造体のUIオブジェクトを保持している、配列のUIオブジェクトを保持していますが、構造体はありません。構造体は、 'loadNibName'によってセルを作成しません.... – Tj3n

+0

@ Tj3nはいUIButtonを渡す方法はわかりませんでしたが、私はなぜUIImageのために書いたのですか?それはうまくいきますが、私はUIButtonを望みます。 –

答えて

0

これはあなたがあなたの質問で尋ねているところから離れていますが、私はあなたがこのようなものを探していると信じています。私はコードとコメントが自分自身のために話すことを願っています。

// My cell from xib (storyboard) 
class MyTableViewCell: UITableViewCell { 

    @IBOutlet weak var button: UIButton! 
    @IBOutlet weak var cellImageView: UIImageView! 
    @IBOutlet weak var label: UILabel! 

} 

// My view controlle from xib (storyboard) 
class MyViewController: UIViewController { 

    @IBOutlet weak var tableView: UITableView! 

    fileprivate var dataSource: [CellData] = [CellData]() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     dataSource = [CellData(index: 0, title: "First cell", image: nil, target: self, selector: #selector(firstCellPressed)), 
         CellData(index: 1, title: "Another cell", image: nil, target: self, selector: #selector(anyOtherCellPressed))] 
     tableView.reloadData() 
    } 

    @objc private func firstCellPressed() { 
     print("First cell pressed") 
    } 

    @objc private func anyOtherCellPressed(sender: UIButton) { 
     print("Cell at row \(sender.tag) pressed") 
    } 

} 

fileprivate extension MyViewController { 

    struct CellData { 
     let index: Int 
     let title: String? 
     let image: UIImage? 
     let target: Any? 
     let selector: Selector 
    } 

} 

extension MyViewController: UITableViewDataSource { 

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "myCellIdentifier", for: indexPath) as! MyTableViewCell // Dequeue cell 
     let source = dataSource[indexPath.row] // Get the source object 
     cell.button.tag = indexPath.row // Assign tag so we can use it in the button action method 

     // Assign target and selector if it exists 
     if let target = source.target { 
      cell.button.addTarget(target, action: source.selector, for: .touchUpInside) 
     } 
     cell.cellImageView.image = source.image // Assign image 
     cell.label.text = source.title // Assign title 
     return cell 
    } 

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return dataSource.count 
    } 

} 

これはまだ私がやることではありませんが、実験することは自由です。

+0

ありがとう、あなたのコードは魅力的に機能します。タップしたときにボタンに変更を加える方法はありますか?それはコンソールにメッセージを出しているようです。ボタンの画像を変更し、それが押されたことを伝えたい場合はどうすればよいですか? –

+0

@Trikhaさて、あなたは変更を追跡する必要があります。私はそれがあなたのデータソースでそれを追跡するのが最善であると言います。だから、あなたのクラスに別のプロパティを追加することです(例: "isPressed"、デフォルトはfalse)。次に、行のセルでは、押さないために必要なイメージを追加します。メソッドがトリガーされると、dataSource [sender.tag] .isPressed =!dataSource [sender.tag] .isPressedのようなデータソースのプロパティを変更し、その単一のセルをリロードします。テーブルビューにはインデックスパスでセルを更新するメソッドがあります... –

関連する問題