swift - 从@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)
}
}
解决方案
您可以使用此扩展访问父视图控制器:
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 不应该知道控制器。我建议使用代表。
推荐阅读
- java - 如何在多线程中并行启动 Java 线程?
- php - 如何将简单的php数组转换为带头的json数据
- javascript - 编写 JS 存储 10 个值但 TypeError: input is a void element tag and must not have `children` 也不能使用 `dangerouslySetInnerHTML
- java - 无法使用java在android上发送每日通知
- javascript - 在内容脚本中打开弹出窗口(chrome 扩展)
- php - 使用可调用添加到 Laravel 查询
- next.js - 如何仅在 nextjs 应用程序的一页上隐藏标题?
- java - 如何同时将数据从一个活动传递到两个或多个活动?
- c# - 在多线程问题中没有得到预期的输出
- php - 按特定值查找所有 JSON 记录