Перейдите к ViewController из @IBDesignable UIView didSelectRowAt UITableView - PullRequest
0 голосов
/ 14 января 2020

Я создал файл @IBDesignable View и реализовал в нем табличное представление. Данные приходят и TableView работает, но только я сталкиваюсь с проблемой во время выбора ячейки, которая должна открыться для другого ViewController. Поскольку это файл представления @IBDesignable, а не viewController.swift

Как перейти к viewController из @IBDesignable UIView выбор ячейки таблицы с передачей значений?

Ошибка: has no member 'navigationController' если я использую self .

Код:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    let actionType = AppData?.items?[indexPath.row].actionType

    switch actionType {
    case 5:
        print(actionType ?? 0)
        let urlLink = AppData?.items?[indexPath.row].actionUrl
        let titleText = AppData?.items?[indexPath.row].textValue
        let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)
        let vc = storyboard.instantiateViewController(withIdentifier: "WebViewController") as! WebViewController
        vc.url = urlLink ?? ""
        vc.titleText = titleText ?? ""
        self.navigationController.pushViewController(vc, animated: true)

    default:
        print(actionType ?? 0)

        }

    }

Ответы [ 2 ]

1 голос
/ 14 января 2020

Вы можете получить доступ к родительскому контроллеру представления, используя это расширение:

extension UIView {
  var viewController: UIViewController? {
    var responder: UIResponder? = self
    while responder != nil {
      if let responder = responder as? UIViewController {
        return responder
      }
      responder = responder?.next
    }
    return nil
  }
}

Вы можете использовать его следующим образом в своем коде:

let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)
let vc = storyboard.instantiateViewController(withIdentifier: "WebViewController") as! WebViewController
vc.url = urlLink ?? ""
vc.titleText = titleText ?? ""
self.viewcontroller?.navigationController?.pushViewController(vc, animated: true)

Примечание: Хотя вы можете получить родительский контроллер UIView, это не рекомендуется, так как UIView не должен знать о контроллере. Я предлагаю использовать делегатов.

0 голосов
/ 14 января 2020

Ваш UITableView является UIView, поэтому он не является UIViewController и не имеет UINavigationController.

Вы должны создать delegate в вашем UITableView, который будет реализован вашим UIViewController.

Примерно так:

protocol MyTableViewDelegate: class {
    func didSelectRow(url: String, titleText: String)
}

Добавьте переменную делегата в табличное представление, например:

weak var delegate: MyTableViewDelegate?

, и вызовите свой делегат следующим образом:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let actionType = AppData?.items?[indexPath.row].actionType

    switch actionType {
    case 5:
        print(actionType ?? 0)
        let urlLink = AppData?.items?[indexPath.row].actionUrl
        let titleText = AppData?.items?[indexPath.row].textValue
        self.delegate.didSelectRow(url: url, titleText: titleText)
    default:
        print(actionType ?? 0)
    }
}

В вашем контроллере представления:

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

, а затем добавить делегата: yourTableView.delegate = self

делегат для реализации:

extension MyViewController: MyTableViewDelegate {
    func didSelectRow(url: String, titleText: String) {

        let vc = storyboard.instantiateViewController(withIdentifier: "WebViewController") as! WebViewController
        vc.url = urlLink
        vc.titleText = titleText
        self.navigationController.pushViewController(vc, animated: true)
    }
}
...