Переход из таблицы на новый view

collectionview
swift
tableview

#1

На данном экране реализована коллекция в виде карусельки. Внутрь ячейки вставлена таблица. Для всего создан соответствующий класс:
ViewController - в нем инициализирована коллекция
CollectionView - в нем инициализирована таблица

При нажатии на ячейку Таблицы нужно перейти в detailViewController и передать соответствующие данные (var data).

Не получается это сделать т.к. метод didSelectRowAt вызывается внутри класса CollectionView, а в нем я не могу добраться до self.navigationController?.pushViewController(viewController: _, animated: _).

Подписать таблицу в класс контроллера не могу. Протоколом тоже не получилось (возможно из-за моей неграмотности).

Какие будут советы в данной ситуации?


#2

Сперва перебрасываете делегат из вашего VC в CollectionViewCell, после чего из CollectionViewCell в TableViewCell.


#3

Как понять перебрасывать делегат? Делегат кого и как это делать?


#4

я бы просмотрел базовый курс по табличному приложению. Так эти темы поднимаются и решаются. Но если коротко, то делегат - это такой паттерн, решение, когда мы можем поручить выполнение какого-то кода, другому классу.

Например, у нашего класса есть метод, и мы в этом методы что-то обновляем или делаем переход. Но хотим чтобы этот метод вызывал на наш класс, а другой. Тогда мы объект нашего класса передаем в другой в качестве делегата. И там у этого объекта можно вызвать какой-то метод.

Вот пример кода, где мы делегируем функцию пробуждения будильнику. Код кривой, в том плане что я протоколы сюда не приписал. Но он работает и показывает как это работает.

class Person {
	
	private var clock = Clock()
	
	func sleep() {
		clock.delegate = self
		clock.alarm(in: 10)
	}
	
	func wakeUp(message: String) {
		print(message)
	}
}

class Clock {
	
	weak var delegate: Person?
	
	func alarm(in minutes: Int) {
		print("tick...tick...")
		delegate?.wakeUp(message: "Wake up, the matrix has you!")
	}
}

let p = Person()
p.sleep()

#5

я пробовал так сделать, проблема в том, что данные не передаются. пробовал двумя способами

let secVC = DetailViewController()
let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "DetailViewController") as! DetailViewController
secVC.str = "hello"
        vc.str = "hello1"

#6

Вы совсем не так пробовали это делать. У вас совсем не то.
Для передачи данных между контроллерами, используется метод prepare.
Для обратной связи используется делегирование.

Проще говоря, вам нужно передать указатель на ваш контроллер, т.е. перебросить его до вашей таблицы.


#7

данные нужно по indexPath.row и закинуть их в отдельную константу, а ее уже передать в класс контроллера, а потом передать через prepare?


#8
class VC: CVCellDelegate {
    func collectionView() {
        cell.delegate = self
    }

    func someDelegateMethod() {
        //получаете нужные данные и делаете переход
    }
}

protocol CVCellDelegate: class {
    func someDelegateMethod() //указываете нужные параметры для передачи
}

class CVCell {
    weak var delegate: CVCellDelegate?

    func tableView() {
        cell.delegate = self
    }

    func tableView(didSelectAt) {
        //делаете вычисления и передаете данные в ваш VC
        self.delegate?.someDelegateMethod()
    }
}

#9

Ну ты же видишь что ты другой функционал реализуешь?


#10

Так ведь я не могу подписать свой ViewController под CollectionViewCellDelegate((

когда создаю аутлет CVCell в классе vc выдает ошибку:
error: Illegal Configuration: The ScheduleCollectionCell outlet from the ScheduleViewController to the ScheduleCollectionViewCell is invalid. Outlets cannot be connected to repeating content.


#11

Вижу, просто, понять не могу, как реализовать эту передачу данных через делегирование, потому что какими бы способами я не пробовал - Xcode ругается((


#12

Я вам дал рабочий абстрактный код. Думайте дальше.


#13

Ну “тут 2 путя”:

  1. Пройти курс на swiftbook.ru
  2. Найти человека который шарит и заплатить ему денег за консультацию
  3. Рыться и разбираться в туториалах. Тут плюсы в том что бесплатно и разбираясь можно глубже понять, но главный минус это намного дольше.

Лично я когда встречаю затык и нет туториалов и статей, то мне проще найти человека и у него все расспросить. :slight_smile:

И кстати, не понимаю, почему люди не хотят на курсы идти. Это не конкретно к тебе, а вообще. Многим говорю “вот идите на курс”, они “да, надо бы”, но видно что даже открывать не будет. Хотя сам их смотрел, а к некоторым (по многопоточности) даже возвращался. Потому что забывается что-то. На работе не всеми фишками получается работать. :thinking:


#14

Спасибо, люди добрые, что не сказали мне сразу ответ и теперь я точно на всю жизнь запомнил эти протоколы и делегирование!!)) если кому интересно, нашел применение “делегирование протоколом” на примере в видео тыг-дык