从@IBDesignable UIView导航到ViewController didSelectRowAt UITableView

问题描述 投票:0回答:2

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

如何从具有传递值的@IBDesignable UIView表格视图单元格导航到viewController?

错误:如果使用自我,则为has no member 'navigationController'

代码:

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)

        }

    }
swift uitableview uiview uiviewcontroller uinavigationcontroller
2个回答
0
投票

您的UITableViewUIView,因此它不是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)
    }
}

0
投票

尽管可以获取UIView的父控制器,但不建议这样做,因为UIView不应知道该控制器。我建议使用代表。但是这是一个使用扩展名从视图内访问它的解决方案:

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)
© www.soinside.com 2019 - 2024. All rights reserved.