Как сделать segue от xib-ячейки таблицы

segue

#1

Здравствуйте!
Есть таблица, к ней посредством xib-файла сделал ячейку UITableViewCell. В ячейке 4 метки. При нажатии на ячейку необходимо перейти к View, передав этому View значения из меток. У ячейки установлен атрибут Detail Disclosure, что подразумевает возможность даже не одного, а двух переходов.

Однако Xcode не позволяет сделать segue от xib-ячейки. Попытался прописать переход в коде (функцией), но функцию обычно связываю с кнопкой через IBAction (как у Ивана в видео). От xib-ячейки же можно сделать только Outlet.

Подскажите, пожалуйста, я не так настроил ячейку? Как решить проблему?


#2

Создайте протокол в ячейке, который будет отправлять ваши клики в ViewController, от туда уже будете открывать ваши segue, передавая в них данные через протокол.


#3

RexHunt, спасибо большое за ответ. Не могли бы Вы уточнить: а как именно определить, что клик сделан? У меня проблема именно в этом - если сегвей по кнопке - то нажатие в контроллер передается через IBAction. А через протокол как?

Или Вы имеете в виду, что клик можно определить через стандартные функции/переменные класcа UITableViewCell, например, var isSelected: Bool ?


#4

В вашем файле CustomViewCell делаете такие же IBAction на элементы, которые должны нажиматься, либо ставите на них TapGestureRecognizer (если это не кнопки).
После этого в самом начале создаете протокол

protocol CustomViewCellDelegate: class {
   func didElementClick(_ valueToPush: Int/String/Etc)
}

Внутри CustomViewCell создаете свойство
weak var delegate: CustomViewCellDelegate?

В методе, который будет вызываться после нажатия, вызываете данный делегат
delegate?.didElementClick(тут передадите данные)

В своем ViewController’e, в методе tableView(viewCell at) подпишитесь на данный протокол у ячейки
cell.delegate = self

После этого добавьте extension для ViewController’a

extension ViewController: CustomViewCellDelegate {
   func didElementClick(_ value: ...) {
      тут вызываете свой segue и передаете ему данные, полученные из ячейки
   }
}

#5

В том то и дело, что Xcode не позволяет сделать IBAction для xib-ячейки - только Outlet и Outlet collection. TapGestureRecognizer попробую сделать.

Спасибо большое!


#6

Так вам нужен клик только на ячейку или на 4 метки внутри ячейки?


#7

На ячейку. На наличие меток я указал чтобы объяснить необходимость Xib-файла. Сегвей и IBAction пытался сделать от ячейки. Да, честно говоря, и от меток пытался тоже ))


#8

Для нажатия на ячейку таблицы существует готовый метод, который реализован у делегата таблицы
tableView(didSelect)


#9

Да, должно сработать - ячейка в приложении выделяется нормально. Еще Ваши советы навели на мысль, что в ячейку поверх меток можно сделать прозрачную кнопку - а от нее уже IBAction работает стандартно. Правда архитектурно, наверное, это криво.

Спасибо еще раз! Сделаю - сообщу о результатах.


#10

Не нужно никаких кнопок поверх ячейки.
Нажатие на ячейку через метод выше. В нем получаете данные по индексу ячейки из модели. Дальше уже стандартные действия с полученными данными.


#11

Да, был уверен что проблема должна решаться просто))


#12

Добрый день. Решаю похожу проблему, на этапе

тут вызываете свой segue и передаете ему данные, полученные из ячейки

возникли проблемы. Что значит вызывать segue?


#13

performSegue(withIdentifier:...)
Вроде так было


#14

Золотой вы человек)))


#15

и еще один вопрос, что значит слово class здесь?


#16

просто обозначение для протокола, сейчас это уже устарело и нужно ставить AnyObject вроде.
Xcode подскажет точнее.


#17

огромное вам спасибо, не подскажете еще почему при прокидывании tap gesture recognizer на ячейку в xib кидает ошибку

Thread 1: "invalid nib registered for identifier (taskCell) - nib must contain exactly one top level object which must be a UITableViewCell instance"

#18

а зачем вы так делаете?
для тапа на ячейку у таблицы есть отдельный метод
tableView(didSelectRowAt)
можете перейти по классу UITableViewDelegate и посмотреть все его методы


#19

то есть вы хотите сказать что можно всего лишь отслеживать по методу tableView(didSelectRowAt) какая ячейка нажимается, и тогда выполнять show нужного мне VC? Prepare при таком методе работать будет?


#20

Именно. Похоже вы пропустили туториалы по работе с таблицей.
Тут на форуме и на сайте это все есть, можете почитать.