从@IBDesignable UIView didSelectRowAt UITableView 导航到 ViewController

Navigate to ViewController from @IBDesignable UIView didSelectRowAt UITableView

我创建了一个@IBDesignable View 文件并在其中实现了tableview。数据即将到来并且 tableView 正在工作,但只有我在 select 单元格必须向其他 ViewController 打开时遇到问题。因为它是一个@IBDesignable 视图文件,而不是 viewController.swift

如何使用传递值从@IBDesignable UIView tableview 单元格 select 导航到 viewController?

错误: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)

        }

    }

你的 UITableViewUIView 所以它不是 UIViewController 也没有 UINavigationController.

您应该在您的 UITableView 中创建一个 delegate,它将由您的 UIViewController 实施。

类似的东西:

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

在您的 table 视图中添加一个委托变量,例如:

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)
    }
}

在你的视图控制器中:

您应该将您的 table 视图自定义 class 添加到您的 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)
    }
}

您可以使用此扩展访问父视图控制器:

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)

Note: Although you can get the parent controller of UIView, it is not recommended as the UIView should not be aware of the controller. I suggest using Delegates.