从@IBDesignable UIView didSelectRowAt UITableView 导航到 ViewController
Posted
技术标签:
【中文标题】从@IBDesignable UIView didSelectRowAt UITableView 导航到 ViewController【英文标题】:Navigate to ViewController from @IBDesignable UIView didSelectRowAt UITableView 【发布时间】:2020-01-14 08:27:06 【问题描述】:我创建了一个@IBDesignable 视图文件并在其中实现了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)
【问题讨论】:
您好,如果您使用 Xib 文件作为表格视图,您应该使用 Controller 来实例化它,不是吗? @EtienneJézéquel 它是一个 IBDesignable 类 UIView。 是的,但它嵌入在 ViewController 中? @EtienneJézéquel 是的。在 ViewController 中,我在底部有 tabbarController 类型按钮,在其中一个按钮上单击它就像一个弹出视图。 【参考方案1】:你可以使用这个扩展访问父视图控制器:
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 不应该知道控制器。一世 建议使用委托。
【讨论】:
【参考方案2】:您的UITableView
是UIView
,所以它不是UIViewController
,也不是UINavigationController
。
您应该在您的UITableView
中创建一个delegate
,它将由您的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)
【讨论】:
首先谢谢你。我在添加委托yourTableView.delegate = self
中实现了所有只得到一个错误我在viewController viewDidLoad
中使用它我做对了吗?
是的,您做得对,您如何将表格视图添加到控制器?你应该有这样的东西:@IBOutlet weak var historyTableView: YourTableView!
?
完成了。谢谢你。我犯了一个错误。以上是关于从@IBDesignable UIView didSelectRowAt UITableView 导航到 ViewController的主要内容,如果未能解决你的问题,请参考以下文章
Swift @IBDesignable/@IBInspectable UIView 样式
UIView 初始化覆盖导致 IBDesignable 崩溃
如何在 UIView 和 UIImageView 中重用相同的 IBDesignable 代码
层的 UIView 的子层在 Storyboard 中显示为 @IBDesignable,但在模拟器中却没有