Как в классе NSObject обработать didSelectRowAt и открыть View?

swift
tableviewcell

#1

Привествую. Подскажите кто знает, как корректно в NSObject обработать didSelectRowAt и открыть требуемый View?

class NewsTableHandler: NSObject, UITableViewDataSource, UITableViewDelegate {


var articles: [Article] = []
var imageUrl: String = ""
var images: [String] = [] 
var jsonContainer: [Article] = []
let newsView = NewsView()


func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 0
}


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    return UITableViewCell()
}


func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    print("\n NewsCollectionHandler didSelectRowAt")
    let item = articles[indexPath.row]
    //let media = medias[indexPath.row]
    guard let url = URL(string: item.link ?? " ") else { return }
    newsView.url = url
    // UIApplication.shared.keyWindow?.rootViewController?.present(newsView, animated: true, completion: nil)
}
}

#2

Добавьте в ваш класс weak свойство на родителя (UIViewController), в контроллере создайте объект вашего класса, передайте в него родителя, так же для таблицы укажите делегат и датасорс ваш созданный объект. Все.


#3

В свой класс я добавляю

weak var customView: NewsView!

В контроллер
let newsTableHandler = NewsTableHandler()

передайте в него родителя - вот это не понял. Если можно подскажите

Создаю в контроллере
var viewTable: UITableView!

Делегаты

viewTable.delegate = newsTableHandler

viewTable.dataSource = newsTableHandler

И вот дальше не понимаю, как открыть этот контроллер с didSelectRowAt
у меня же там navigationController?.pushViewController и подобное не срабатывает

Спасибо как всегда за ответ,
Что бы делал этот форум если бы Вы и heymob не отвечали


#4

Создайте инит в NewsTableHandler, который будет принимать родителя. Только вам нужно передавать не view, а ViewController. В таком случае вам сперва нужно будет получить его в вашем NewsView из которого потом вы передадите его в NewsTableHandler, а уже в NewsTableHandler в методе didSelectRowAt будете вызывать parent?.navigationController?.pushViewController.
В принципе можете сразу передавать ссылку не на контроллер, а на parent?.navigationController.
Если вам нужно придерживаться распределения зон видимости кода, тогда в вашем NewsView держите ссылку на контроллер и создайте метод, где будет идти вызов контроллера, в NewsTableHandler передавайте ссылку на NewsView , а в методе didSelectRowAt вызывайте метод вызова из NewsView.
Либо совсем все по феншую: для NewsTableHandler сделать делегат, который будет сигналить в ваш NewsView.


#5

Понял. Делаю, благодарю


#6

Листаю я значит Habr Q&A и опачки https://qna.habr.com/q/977889 :slight_smile:


#7

Это было еще до того, как тут не написал. Там было все пустое, написал тут. И сделал, по Вашей рекомендации