Використовуйте розширення для UITableView, щоб отримати комірку для будь-якого подання:
@ Відповідь Paulw11 про налаштування користувальницького типу комірок із властивістю делегата, який надсилає повідомлення на подання таблиці - це хороший спосіб, але для налаштування потрібна певна робота.
Я думаю, що ходити по ієрархії подання комірки у вигляді таблиці, шукаючи комірку, є поганою ідеєю. Це тендітно - якщо згодом ви вкладете свою кнопку у подання для макетування, цей код, ймовірно, зламається.
Використання тегів перегляду також неміцне. Ви повинні пам’ятати про теги під час створення комірки, і якщо ви використовуєте такий підхід у контролері перегляду, який використовує теги подання з іншою метою, ви можете мати дублюючі номери тегів, і ваш код може працювати не так, як очікувалося.
Я створив розширення до UITableView, яке дозволяє отримати indexPath для будь-якого подання, яке міститься в комірці табличного подання. Він повертає значення, Optional
яке буде рівним нулю, якщо переданий подання насправді не потрапляє до комірки подання таблиці. Нижче наведено повністю вихідний файл розширення. Ви можете просто розмістити цей файл у своєму проекті, а потім використовувати включений indexPathForView(_:)
метод, щоб знайти indexPath, який містить будь-яке представлення.
//
// UITableView+indexPathForView.swift
// TableViewExtension
//
// Created by Duncan Champney on 12/23/16.
// Copyright © 2016-2017 Duncan Champney.
// May be used freely in for any purpose as long as this
// copyright notice is included.
import UIKit
public extension UITableView {
/**
This method returns the indexPath of the cell that contains the specified view
- Parameter view: The view to find.
- Returns: The indexPath of the cell containing the view, or nil if it can't be found
*/
func indexPathForView(_ view: UIView) -> IndexPath? {
let center = view.center
let viewCenter = self.convert(center, from: view.superview)
let indexPath = self.indexPathForRow(at: viewCenter)
return indexPath
}
}
Щоб використовувати його, ви можете просто викликати метод в IBAction для кнопки, яка міститься в комірці:
func buttonTapped(_ button: UIButton) {
if let indexPath = self.tableView.indexPathForView(button) {
print("Button tapped at indexPath \(indexPath)")
}
else {
print("Button indexPath not found")
}
}
(Зауважимо, що indexPathForView(_:)
функція буде працювати лише в тому випадку, якщо об'єкт перегляду, який він передає, міститься в комірці, яка наразі знаходиться на екрані. Це розумно, оскільки представлення, яке не є на екрані, насправді не належить до конкретного indexPath; це, ймовірно, призначається іншому indexPath, коли він містить комірку, яка переробляється.)
Редагувати:
Ви можете завантажити робочий демонстраційний проект, який використовує вищевказане розширення, з Github: TableViewExtension.git