从@IBDesignable UIView didSelectRowAt UITableView 导航到 ViewController
Navigate to ViewController from @IBDesignable UIView didSelectRowAt UITableView
我创建了一个@IBDesignable View 文件并在其中实现了tableview。数据即将到来并且 tableView 正在工作,但只有我在 select 单元格必须向其他 ViewController 打开时遇到问题。因为它是一个@IBDesignable 视图文件,而不是 viewController.swift
如何使用传递值从@IBDesignable UIView tableview 单元格 select 导航到 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)
}
}
你的 UITableView
是 UIView
所以它不是 UIViewController
也没有 UINavigationController
.
您应该在您的 UITableView
中创建一个 delegate
,它将由您的 UIViewController
实施。
类似的东西:
protocol MyTableViewDelegate: class {
func didSelectRow(url: String, titleText: String)
}
在您的 table 视图中添加一个委托变量,例如:
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)
}
}
在你的视图控制器中:
您应该将您的 table 视图自定义 class 添加到您的 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)
}
}
您可以使用此扩展访问父视图控制器:
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)
Note: Although you can get the parent controller of UIView, it is not
recommended as the UIView should not be aware of the controller. I
suggest using Delegates.
我创建了一个@IBDesignable View 文件并在其中实现了tableview。数据即将到来并且 tableView 正在工作,但只有我在 select 单元格必须向其他 ViewController 打开时遇到问题。因为它是一个@IBDesignable 视图文件,而不是 viewController.swift
如何使用传递值从@IBDesignable UIView tableview 单元格 select 导航到 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)
}
}
你的 UITableView
是 UIView
所以它不是 UIViewController
也没有 UINavigationController
.
您应该在您的 UITableView
中创建一个 delegate
,它将由您的 UIViewController
实施。
类似的东西:
protocol MyTableViewDelegate: class {
func didSelectRow(url: String, titleText: String)
}
在您的 table 视图中添加一个委托变量,例如:
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)
}
}
在你的视图控制器中:
您应该将您的 table 视图自定义 class 添加到您的 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)
}
}
您可以使用此扩展访问父视图控制器:
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)
Note: Although you can get the parent controller of UIView, it is not recommended as the UIView should not be aware of the controller. I suggest using Delegates.