2017-01-07 2 views
1

У меня есть пользовательский UITableViewCell, на котором у меня есть Label, который необходимо сделать кликабельным в зависимости от определенного состояния. Поэтому я добавил на нем TapGestureRecognizer. Я использовал протоколы и делегаты для них. Я хочу передать параметр вместе с выполнением segue по щелчку этого UILabel. Я могу выполнить этот segue, но не могу определить, какой ярлык ячеек был им.Как распознать ярлык на пользовательском UITableViewCell - Swift 3

Я новичок в этом и застрял на несколько часов. Любая помощь будет оценена по достоинству. Пожалуйста, также скажите мне, есть ли еще один простой способ для того же результата.

Если бы это была кнопка, я мог бы добавить цель, но я действительно застрял сейчас.

+0

Вы хотите нажать на определенную часть ярлыка или на полной этикетке? Если это будет полным, нет смысла использовать ваш подход.Вместо этого используйте 'UIButton' – KrishnaCA

+0

. Фактически это обратный отсчет и по его завершению меняют текст ярлыка и делают его интерактивным. – Dia

+3

Вы можете использовать' UIButton' и включить/отключить его соответственно, используя свойство 'enabled' – KrishnaCA

ответ

2

Поскольку @KrishnaCA говорит в своем ответе, если вы хотите, чтобы вся этикетка была нажата, возможно, лучше использовать кнопку. Если вам нужно, чтобы он выглядел иначе, чем кнопка, вы также можете поместить прозрачную кнопку (пользовательский стиль без изображения) поверх метки.

Независимо от того, используете ли вы кнопку или ярлык + распознаватель жестов, вы все равно должны выяснить, на каком индексе, на который пользователь постучал. Вы можете поместить тег в кнопку/метку, как предлагает Хамид, но это хрупко. Я предпочитаю другой способ. Я написал расширение для UITableView, который позволяет выяснить, в какой ячейке принадлежит данный вид:

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 origin = view.bounds.origin 
    let viewOrigin = self.convert(origin, from: view) 
    let indexPath = self.indexPathForRow(at: viewOrigin) 
    return indexPath 
    } 
} 

Если добавить, что расширение для вашего проекта вы можете использовать код, как показано ниже.

Жест распознаватель:

@objc func alertClicked(sender: UIGestureRecognizer){ 
    let view = sender.view 
    let indexPath = tableView.indexPathForView(view) 
    //Do whatever you need to do with the indexPath 
} 

или, кнопки действий:

@objc func buttonClicked(sender: UIButton) { 
    let indexPath = tableView.indexPathForView(sender) 
    //Do whatever you need to do with the indexPath 
} 
0

дать каждой ячейке уникальный тег, а затем:

self.tag = x // x is a unique number 
label.isUserInteractionEnabled = true 

let tapGesture = UITapGestureRecognizer(target: self, action:#selector(self.alertClicked(sender:))) 
self.label.addGestureRecognizer(tapGesture) 
tapGesture.delegate = self 

и добавить эту функцию к вашему CustomCell Класс:

func alertClicked(sender: UITapGestureRecognizer){ 
    print(self.tag)// prints x 

} 
0

много способов вы можете сделать это, вы могли бы дать метки в тег внутри cellForIndexPath Tableview метод делегата, как это:

label.tag = (indexPath as NSIndexPath).row 

Тогда внутри функции крана жест:

func labelTapped (_ sender:UITapGestureRecognizer) { 

    if sender.view?.tag! == someRequiredNumber { 

    // Perform Segue 

    } 

} 

Вы можете определить, какой ярлык был выполнен щелчок это tag свойство, а затем вам придется придумать какой-то логики внутри метода tapGesture (я использовал someRequiredNumber в качестве примера) к определить, должен ли пользователь иметь возможность инициировать сеанс

0

Лично я предпочитаю подклассу в TableViewCell и использовать методы делегата для отправки отводы обратно в TableView. Вам нужно будет предоставить и удерживать indexPath в TableViewCell и передать его обратно с помощью метода делегирования, который технически разбивает MVC, но лично код намного чище. Я могу опубликовать код, если вы заинтересованы в этом.