首页 > 解决方案 > 从@IBDesignable UIView didSelectRowAt UITableView 导航到 ViewController

问题描述

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

如何通过传递值从@IBDesignable UIView tableview 单元格选择导航到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)

        }

    }

标签: swiftuitableviewuiviewuiviewcontrolleruinavigationcontroller

解决方案


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

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 不应该知道控制器。我建议使用代表。


推荐阅读