カスタムセルにカスタムボタンがあるアプリがあります。セルを選択すると、詳細ビューに切り替わりますが、これは完璧です。セル内のボタンを選択すると、次のコードはセルインデックスをコンソールに出力します。
選択したセルのコンテンツにアクセスし(ボタンを使用)、配列または辞書に追加する必要があります。私はこれが初めてなので、セルのコンテンツにアクセスする方法を見つけるのに苦労しています。 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)")
}
オプション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)")
}
_
テーブルビューには1つのセクションがあるため、以下のようにセルオブジェクトを取得できます。
let indexPath = NSIndexPath(forRow: tag, inSection: 0)
let cell = tableView.cellForRowAtIndexPath(indexPath) as! CustomCell!
ボタンタグから取得するタグ。
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
に必要なメソッドを実装します。
@IBAction func buttonTap(sender: UIButton) {
let button = sender as UIButton
let indexPath = self.tableView.indexPathForRowAtPoint(sender.center)!
}
XCODE 8:重要な注意
タグを0以外の値に設定することを忘れないでください。
Tag = 0でオブジェクトをキャストしようとすると、動作する可能性がありますが、奇妙な場合には動作しません。
修正方法は、タグを異なる値に設定することです。それが誰かを助けることを願っています。
Caoの答えに基づいて、コレクションビューセルのボタンを処理するソリューションを次に示します。
@IBAction func actionButton(sender: UIButton) {
let point = collectionView.convertPoint(sender.center, fromView: sender.superview)
let indexPath = collectionView.indexPathForItemAtPoint(point)
}
ConvertPoint()関数呼び出しは、コレクションビュースペース内のボタンポイント座標を変換することに注意してください。 Without、indexPathは常に同じセル番号0を参照します