从@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】:

您的UITableViewUIView,所以它不是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,但在模拟器中却没有

@IBDesignable UIView 不在情节提要中调用 init

渐变不填充 IBDesignable UIView