web-dev-qa-db-ja.com

ボタンタグを使用してSwiftでカスタムセルのコンテンツにアクセスする方法は?

カスタムセルにカスタムボタンがあるアプリがあります。セルを選択すると、詳細ビ​​ューに切り替わりますが、これは完璧です。セル内のボタンを選択すると、次のコードはセルインデックスをコンソールに出力します。

選択したセルのコンテンツにアクセスし(ボタンを使用)、配列または辞書に追加する必要があります。私はこれが初めてなので、セルのコンテンツにアクセスする方法を見つけるのに苦労しています。 didselectrowatindexpathを使用してみましたが、インデックスをタグのインデックスに強制する方法がわかりません...

基本的に、各セルにcell.repeatLabel.textとして「犬」、「猫」、「鳥」の3つのセルがあり、行1と3(インデックス0と2)のボタンを選択すると、配列/辞書に「犬」と「鳥」を追加します。

    // MARK: - Table View

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 1
}

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

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell: CustomCell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! CustomCell

    // Configure the cell...
    var currentRepeat = postsCollection[indexPath.row]
    cell.repeatLabel?.text = currentRepeat.product
    cell.repeatCount?.text = "Repeat: " + String(currentRepeat.currentrepeat) + " of " + String(currentRepeat.totalrepeat)

    cell.accessoryType = UITableViewCellAccessoryType.DetailDisclosureButton

    cell.checkButton.tag = indexPath.row;

    cell.checkButton.addTarget(self, action: Selector("selectItem:"), forControlEvents: UIControlEvents.TouchUpInside)


    return cell

}

func selectItem(sender:UIButton){

    println("Selected item in row \(sender.tag)")

 }
19
Steve Rowe

オプション1委任で処理する

セルのサブビューから発生したイベントを処理する正しい方法は、delegationを使用することです。

したがって、次の手順を実行できます。

1。クラス定義の上に、カスタムセル内に単一インスタンスメソッドを持つプロトコルを記述します。

_protocol CustomCellDelegate {
    func cellButtonTapped(cell: CustomCell)
} 
_

2。クラス定義内でデリゲート変数を宣言し、デリゲートでプロトコルメソッドを呼び出します。

_var delegate: CustomCellDelegate?

@IBAction func buttonTapped(sender: AnyObject) {
    delegate?.cellButtonTapped(self)
}
_

テーブルビューがあるクラスのCustomCellDelegateに準拠します。

_ class ViewController: CustomCellDelegate
_

4。セル​​のデリゲートを設定します

_func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as CustomCell
    cell.delegate = self

    return cell
}
_

5。 View Controllerクラスに必要なメソッドを実装します。

EDIT:最初に空の配列を定義してから、次のように変更します。

_private var selectedItems = [String]()

func cellButtonTapped(cell: CustomCell) {
    let indexPath = self.tableView.indexPathForRowAtPoint(cell.center)!
    let selectedItem = items[indexPath.row]

    if let selectedItemIndex = find(selectedItems, selectedItem) {
        selectedItems.removeAtIndex(selectedItemIndex)
    } else {
        selectedItems.append(selectedItem)
    }
}
_

ここで、itemsは、View Controllerで定義された配列です。

_private let items = ["Dog", "Cat", "Elephant", "Fox", "Ant", "Dolphin", "Donkey", "Horse", "Frog", "Cow", "Goose", "Turtle", "Sheep"] 
_

オプション2closuresを使用して処理する

戻ってきて、このような状況を処理する別の方法を紹介することにしました。この場合にクロージャーを使用すると、コードが少なくなり、目標を達成できます。

1。セル​​クラス内でクロージャ変数を宣言します。

_var tapped: ((CustomCell) -> Void)?
_

2。ボタンハンドラー内でクロージャーを呼び出します。

_@IBAction func buttonTapped(sender: AnyObject) {
    tapped?(self)
}
_

In含むView ControllerクラスのtableView(_:cellForRowAtIndexPath:)内:

_let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! CustomCell       
cell.tapped = { [unowned self] (selectedCell) -> Void in
    let path = tableView.indexPathForRowAtPoint(selectedCell.center)!
    let selectedItem = self.items[path.row]

    println("the selected item is \(selectedItem)")
}
_
63
Vasil Garov

テーブルビューには1つのセクションがあるため、以下のようにセルオブジェクトを取得できます。

let indexPath = NSIndexPath(forRow: tag, inSection: 0)
let cell = tableView.cellForRowAtIndexPath(indexPath) as! CustomCell!

ボタンタグから取得するタグ。

10
Amit89

Swiftボタンタグのスーパービューを使用して、@ IBAction関数でアクセスセルのソリューションを取得します。

let cell = sender.superview?.superview as! ProductCell
var intQty = Int(cell.txtQty.text!);
intQty = intQty! + 1
let  strQty = String(describing: intQty!);
cell.txtQty.text = strQty

SwiftのVasil Garovからの回答のオプション1を更新しました

1。CustomCellのプロトコルを作成します。

protocol CustomCellDelegate {
    func cellButtonTapped(cell: CustomCell)
} 

2。TableViewCellに対してdelegate変数を宣言し、そのプロトコルメソッドを呼び出します。

var delegate: CustomCellDelegate?

@IBAction func buttonTapped(sender: AnyObject) {
    delegate?.cellButtonTapped(self)
}

CustomCellDelegateが次のクラスのtableViewに準拠します。

 class ViewController: CustomCellDelegate

4。セル​​のdelegateを設定します

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)  as CustomCell
    cell.delegate = self

    return cell
}

5。ViewControllerに必要なメソッドを実装します。

1
Herr der Töne
@IBAction func buttonTap(sender: UIButton) {
        let button = sender as UIButton
        let indexPath = self.tableView.indexPathForRowAtPoint(sender.center)!
}
1
Cao Yong

XCODE 8:重要な注意

タグを0以外の値に設定することを忘れないでください。

Tag = 0でオブジェクトをキャストしようとすると、動作する可能性がありますが、奇妙な場合には動作しません。

修正方法は、タグを異なる値に設定することです。それが誰かを助けることを願っています。

0
MLBDG

Caoの答えに基づいて、コレクションビューセルのボタンを処理するソリューションを次に示します。

    @IBAction func actionButton(sender: UIButton) {
        let point = collectionView.convertPoint(sender.center, fromView: sender.superview)
        let indexPath = collectionView.indexPathForItemAtPoint(point)
}

ConvertPoint()関数呼び出しは、コレクションビュースペース内のボタンポイント座標を変換することに注意してください。 Without、indexPathは常に同じセル番号0を参照します

0
CyrIng