我创建了一个@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)
}
}
您的UITableView
是UIView
,因此它不是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)
}
}
尽管可以获取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)